Skip to content

Commit 2af50d9

Browse files
committed
添加仓库的关注
1 parent 5484915 commit 2af50d9

File tree

8 files changed

+149
-18
lines changed

8 files changed

+149
-18
lines changed

SwiftPamphletApp/Core/FundationFunction.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func wrapperHtmlContent(content: String, codeStyle: String = "lioshi.min") -> St
3535
func howLongAgo(date: Date) -> String {
3636
let simplifiedChinese = Locale(identifier: "zh_Hans")
3737
return date.formatted(.relative(presentation: .named,
38-
unitsStyle: .spellOut).locale(simplifiedChinese))
38+
unitsStyle: .wide).locale(simplifiedChinese))
3939
}
4040
func howLongFromNow(timeStr: String) -> String {
4141
let cn = Region(zone: Zones.asiaShanghai, locale: Locales.chineseChina)

SwiftPamphletApp/GitHubAPI/DetailView/RepoView.swift

-4
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ struct IssuesView: View {
152152
} else {
153153
IssueLabelView(issue: issue)
154154
}
155-
Divider()
156155
} // end ForEach
157156
} // end List
158157
} // end body
@@ -172,7 +171,6 @@ struct IssueEventsView: View {
172171
} else {
173172
IssueEventLabelView(issueEvent: issueEvent)
174173
}
175-
Divider()
176174
} // end ForEach
177175
} // end List
178176
} // end body
@@ -201,8 +199,6 @@ struct RepoCommitsView: View {
201199
} else {
202200
RepoCommitLabelView(repo: repo, commit: commit, isUnRead: unReadCount > 0 && i < unReadCount)
203201
}
204-
205-
Divider()
206202
} // end ForEach
207203
} // end List
208204
.frame(minWidth: SPC.detailMinWidth)

SwiftPamphletApp/GitHubAPI/Developer/DeveloperListView.swift

+13-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,18 @@ struct DeveloperListView: View {
2020
AsyncImageWithPlaceholder(size: .smallSize, url: dev.avatar)
2121
VStack {
2222
HStack {
23-
Text(dev.name)
23+
if dev.repoName.isEmpty {
24+
Text(dev.name)
25+
26+
} else {
27+
VStack(alignment:.leading) {
28+
Text(dev.repoOwner)
29+
.font(.footnote)
30+
.foregroundColor(light: .secondary, dark: .secondary)
31+
Text(dev.repoName)
32+
}
33+
}
34+
2435
Spacer()
2536
Text(howLongAgo(date: dev.updateDate))
2637
.font(.footnote)
@@ -62,7 +73,7 @@ struct DeveloperListView: View {
6273
}
6374

6475
func addDev() {
65-
let dev = DeveloperModel(name: "", des: "", avatar: "", createDate: Date.now, updateDate: Date.now)
76+
let dev = DeveloperModel(name: "", des: "", avatar: "", repoOwner: "", repoName: "", createDate: Date.now, updateDate: Date.now)
6677
modelContext.insert(dev)
6778
selectDev = dev
6879
}

SwiftPamphletApp/GitHubAPI/Developer/DeveloperModel.swift

+6-1
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ final class DeveloperModel {
1414
var des: String = ""
1515
var avatar: String = ""
1616

17+
var repoOwner: String = ""
18+
var repoName: String = ""
19+
1720
var createDate: Date = Date.now
1821
var updateDate: Date = Date.now
1922

20-
init(name: String, des: String, avatar: String, createDate: Date, updateDate: Date) {
23+
init(name: String, des: String, avatar: String, repoOwner: String, repoName: String, createDate: Date, updateDate: Date) {
2124
self.name = name
2225
self.des = des
2326
self.avatar = avatar
27+
self.repoOwner = repoOwner
28+
self.repoName = repoName
2429
self.createDate = createDate
2530
self.updateDate = updateDate
2631
}

SwiftPamphletApp/GitHubAPI/Developer/EditDeveloper.swift

+121-5
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,142 @@ struct EditDeveloper: View {
1313
@State var vm: UserVM
1414
@State private var tabSelct = 1
1515

16+
@State var vmRepo: RepoVM
17+
@State private var tabSelctRepo = 1
18+
19+
1620
var body: some View {
1721
Form {
1822
HStack {
19-
TextField("用户名:", text: $dev.name, prompt: Text("输入 Github 用户名"))
20-
.onSubmit {
21-
vm = UserVM(userName: dev.name)
22-
vm.doing(.updateAll)
23+
TextField("用户名:", text: $dev.name, prompt: Text("输入 Github 用户名 dev 或仓库名 dev/repo"))
24+
.onChange(of: dev.name) { oldValue, newValue in
25+
let dn = dev.name.components(separatedBy: "/")
26+
if dn.count > 1 {
27+
vmRepo = RepoVM(repoName: dev.name)
28+
vmRepo.doing(.inInit)
29+
dev.repoName = dn.last ?? ""
30+
dev.repoOwner = dn.first ?? ""
31+
} else {
32+
vm = UserVM(userName: dev.name)
33+
vm.doing(.updateAll)
34+
dev.repoName = ""
35+
dev.repoOwner = ""
36+
}
2337
}
2438
TextField("描述:", text: $dev.des)
2539
}
2640
}
2741
.padding(EdgeInsets(top: 10, leading: 10, bottom: 0, trailing: 10))
2842

43+
if dev.name.components(separatedBy: "/").count > 1 {
44+
repoEventView()
45+
} else {
46+
devEventView()
47+
}
48+
}
49+
50+
@ViewBuilder
51+
func repoEventView() -> some View {
52+
HStack {
53+
VStack(alignment: .leading, spacing: 10) {
54+
HStack {
55+
Text(vmRepo.repo.name).font(.system(.largeTitle))
56+
Text("(\(vmRepo.repo.fullName))")
57+
}
58+
HStack {
59+
Image(systemName: "star.fill").foregroundColor(.red)
60+
Text("\(vmRepo.repo.stargazersCount)")
61+
Image(systemName: "tuningfork").foregroundColor(.cyan)
62+
Text("\(vmRepo.repo.forks)")
63+
Text("议题 \(vmRepo.repo.openIssues)")
64+
Text("语言 \(vmRepo.repo.language ?? "")")
65+
ButtonGoGitHubWeb(url: vmRepo.repo.htmlUrl ?? "https://github.com", text: "在 GitHub 上访问")
66+
67+
}
68+
if vmRepo.repo.description != nil {
69+
Text("简介:\(vmRepo.repo.description ?? "")")
70+
}
71+
72+
HStack {
73+
Text("作者:")
74+
AsyncImageWithPlaceholder(size: .smallSize, url: vmRepo.repo.owner.avatarUrl)
75+
ButtonGoGitHubWeb(url: vmRepo.repo.owner.login, text: vmRepo.repo.owner.login, ignoreHost: true)
76+
}
77+
} // end VStack
78+
Spacer()
79+
}
80+
.frame(minWidth: SPC.detailMinWidth)
81+
.onChange(of: vmRepo.repo, { oldValue, newValue in
82+
if !newValue.owner.avatarUrl.isEmpty {
83+
dev.avatar = newValue.owner.avatarUrl
84+
}
85+
})
86+
.onChange(of: vmRepo.commits, { oldValue, newValue in
87+
if ((newValue.first?.commit.author.date.isEmpty) != nil) {
88+
let iso8601String = newValue.first?.commit.author.date ?? ""
89+
let formatter = ISO8601DateFormatter()
90+
dev.updateDate = formatter.date(from: iso8601String) ?? Date.now
91+
}
92+
})
93+
.padding(EdgeInsets(top: 20, leading: 10, bottom: 0, trailing: 10))
94+
.onAppear {
95+
vmRepo.doing(.inInit)
96+
}
97+
// end HStack
98+
99+
TabView(selection: $tabSelct) {
100+
RepoCommitsView(commits: vmRepo.commits, repo: vmRepo.repo)
101+
.tabItem {
102+
Text("新提交")
103+
}
104+
.onAppear {
105+
vmRepo.doing(.inCommit)
106+
}
107+
.tag(1)
108+
109+
IssuesView(issues: vmRepo.issues, repo: vmRepo.repo)
110+
.tabItem {
111+
Text("议题列表")
112+
}
113+
.onAppear {
114+
vmRepo.doing(.inIssues)
115+
}
116+
.tag(2)
117+
118+
IssueEventsView(issueEvents: vmRepo.issueEvents, repo: vmRepo.repo)
119+
.tabItem {
120+
Text("议题事件")
121+
}
122+
.onAppear {
123+
vmRepo.doing(.inIssueEvents)
124+
}
125+
.tag(3)
126+
127+
ReadmeView(content: vmRepo.readme.content.replacingOccurrences(of: "\n", with: ""))
128+
.tabItem {
129+
Text("README")
130+
}
131+
.onAppear {
132+
vmRepo.doing(.inReadme)
133+
}
134+
.tag(4)
135+
136+
} // end TabView
137+
Spacer()
138+
}
139+
140+
@ViewBuilder
141+
func devEventView() -> some View {
29142
HStack {
30143
VStack(alignment: .leading, spacing: 10) {
31144
HStack {
32145
AsyncImageWithPlaceholder(size: .normalSize, url: vm.user.avatarUrl)
33146
VStack(alignment: .leading, spacing: 5) {
34147
HStack {
35148
Text(vm.user.name ?? vm.user.login).font(.system(.title))
36-
Text("(\(vm.user.login))")
149+
if !vm.user.login.isEmpty {
150+
Text("(\(vm.user.login))")
151+
}
37152
Text("订阅者 \(vm.user.followers) 人,仓库 \(vm.user.publicRepos)")
38153
}
39154
HStack {
@@ -97,6 +212,7 @@ struct EditDeveloper: View {
97212
vm.doing(.inEvent)
98213
}
99214
.tag(1)
215+
100216
DeveloperEventView(events: vm.receivedEvents)
101217
.tabItem {
102218
Image(systemName: "keyboard.badge.ellipsis")

SwiftPamphletApp/GitHubAPI/VM/RepoVM.swift

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ final class RepoVM: APIVMable {
4848
switch somethinglike {
4949
case .inInit:
5050
apRepoSj.send(())
51+
apCommitsSj.send(())
52+
apIssueEventsSj.send(())
53+
apIssuesSj.send(())
5154
case .inCommit:
5255
apCommitsSj.send(())
5356
case .inInitJustRepo:

SwiftPamphletApp/HomeUI/DataLink.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,14 @@ struct DataLink: Identifiable {
3838
EmptyView()
3939
}
4040
}
41-
case "开发者":
41+
case "开发/仓库":
4242
switch type {
4343
case .content:
4444
DeveloperListView(selectDev:selectDev)
4545
case .detail:
4646
if let dev = selectDevBindable {
4747
if SPC.gitHubAccessToken.isEmpty == false || SPC.githubAccessToken().isEmpty == false {
48-
EditDeveloper(dev: dev, vm: UserVM(userName: dev.name))
48+
EditDeveloper(dev: dev, vm: UserVM(userName: dev.name), vmRepo: RepoVM(repoName: dev.name))
4949
} else {
5050
Text("请在设置里写上 Github 的 access token")
5151
}
@@ -78,7 +78,7 @@ extension DataLink {
7878
DataLink(title: "资料整理", imageName: "p11")
7979
]),
8080
DataLink(title: "Github", imageName: "", children: [
81-
DataLink(title: "开发者", imageName: "p5"),
81+
DataLink(title: "开发/仓库", imageName: "p5"),
8282
]),
8383
DataLink(title: "Swift指南", imageName: "", children: [
8484
DataLink(title: "语法速查", imageName: "p23"),

SwiftPamphletApp/InfoOrganizer/Info/EditInfoView.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,8 @@ struct EditInfoView: View {
117117
WebUIView(html: wrapperHtmlContent(content: MarkdownParser().html(from: info.des)), baseURLStr: "")
118118
.tabItem { Label("预览", systemImage: "circle") }
119119
.tag(2)
120-
if !info.url.isEmpty {
121-
WebUIView(urlStr: info.url)
120+
if let url = URL(string: info.url) {
121+
WebUIView(urlStr: url.absoluteString)
122122
.tabItem { Label("网页", systemImage: "circle") }
123123
.tag(3)
124124
}

0 commit comments

Comments
 (0)