Skip to content

Commit 5145ef5

Browse files
authored
Merge pull request #108 from v2er-app/feature/notification-improvements-and-credits
feat: add notification time, fix badge, search hint, and credits page
2 parents d3be77a + cc54c6c commit 5145ef5

File tree

6 files changed

+57
-15
lines changed

6 files changed

+57
-15
lines changed

V2er.xcodeproj/project.pbxproj

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
28CC76CC2E963D6700C939B5 /* FilterMenuView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A490A3E111D941C4B30F0BACA6B5E984 /* FilterMenuView.swift */; };
1717
36A1DC574867AA711547556C /* CodeBlockAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42D7F9F8E0B5EA32CC951FD5 /* CodeBlockAttachment.swift */; };
1818
3AEADD24608B3956E80DADEA /* RenderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 547AFEBDC601FEDCE3364643 /* RenderConfiguration.swift */; };
19+
3AFEDD0981C882741CB19FCD /* CreditsPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DD9090A3AEC64AF144E2CA /* CreditsPage.swift */; };
1920
407E8B8C202BF0241BD99568 /* RichView+Preview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 72107B2148D16415A7512930 /* RichView+Preview.swift */; };
2021
484A41DB3858F1C84507E54B /* RenderActor.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6356D706913919766FD0EA5 /* RenderActor.swift */; };
2122
4E55BE8A29D45FC00044389C /* Kingfisher in Frameworks */ = {isa = PBXBuildFile; productRef = 4E55BE8929D45FC00044389C /* Kingfisher */; };
@@ -68,7 +69,6 @@
6869
5D45FC2B26CD3FCF0055C336 /* SwiftSoupExtention.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D45FC2A26CD3FCF0055C336 /* SwiftSoupExtention.swift */; };
6970
5D4E43F82699DBC600650714 /* NewsContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4E43F72699DBC600650714 /* NewsContentView.swift */; };
7071
5D4E43FA2699DDE200650714 /* ReplyItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4E43F92699DDE200650714 /* ReplyItemView.swift */; };
71-
6CA744F9E46B4A388C7D15F1 /* PostscriptItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43141D64D5C4A65B1700BF8 /* PostscriptItemView.swift */; };
7272
5D4E43FC2699E20400650714 /* AvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4E43FB2699E20400650714 /* AvatarView.swift */; };
7373
5D54903326AB9E2200BB0CC0 /* SwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D54903226AB9E2200BB0CC0 /* SwiftUIView.swift */; };
7474
5D5677CB2721916300543FE8 /* CreateReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D5677CA2721916300543FE8 /* CreateReducer.swift */; };
@@ -156,6 +156,7 @@
156156
5DF417742712DA7500E6D135 /* MyRecentState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF417732712DA7500E6D135 /* MyRecentState.swift */; };
157157
5DF80E3626A2D045002ADC79 /* MultilineTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DF80E3526A2D045002ADC79 /* MultilineTextField.swift */; };
158158
62367D67C6E8AE3EC837D0F4 /* MentionParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44998D879D9842BBB61D639E /* MentionParser.swift */; };
159+
6CA744F9E46B4A388C7D15F1 /* PostscriptItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E43141D64D5C4A65B1700BF8 /* PostscriptItemView.swift */; };
159160
9495B5E175158F3646169AA5 /* RichContentView+Preview.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31C4B81E79369CDE4880B773 /* RichContentView+Preview.swift */; };
160161
97B4326BB45897F25FAEBBD1 /* RenderStylesheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8366DEEFEB9819312F65353D /* RenderStylesheet.swift */; };
161162
DAC723E23F071F71DD23FC0D /* RichViewCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40A9E0C514C4D7E9DD4CBEE7 /* RichViewCache.swift */; };
@@ -246,7 +247,6 @@
246247
5D45FC2A26CD3FCF0055C336 /* SwiftSoupExtention.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftSoupExtention.swift; sourceTree = "<group>"; };
247248
5D4E43F72699DBC600650714 /* NewsContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsContentView.swift; sourceTree = "<group>"; };
248249
5D4E43F92699DDE200650714 /* ReplyItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplyItemView.swift; sourceTree = "<group>"; };
249-
E43141D64D5C4A65B1700BF8 /* PostscriptItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostscriptItemView.swift; sourceTree = "<group>"; };
250250
5D4E43FB2699E20400650714 /* AvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarView.swift; sourceTree = "<group>"; };
251251
5D54903226AB9E2200BB0CC0 /* SwiftUIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIView.swift; sourceTree = "<group>"; };
252252
5D5677CA2721916300543FE8 /* CreateReducer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateReducer.swift; sourceTree = "<group>"; };
@@ -333,6 +333,7 @@
333333
5DF417712712CD8D00E6D135 /* NodeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NodeView.swift; sourceTree = "<group>"; };
334334
5DF417732712DA7500E6D135 /* MyRecentState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyRecentState.swift; sourceTree = "<group>"; };
335335
5DF80E3526A2D045002ADC79 /* MultilineTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultilineTextField.swift; sourceTree = "<group>"; };
336+
63DD9090A3AEC64AF144E2CA /* CreditsPage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CreditsPage.swift; sourceTree = "<group>"; };
336337
64AB393F14CD383FE0EA98A9 /* MarkdownRenderer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MarkdownRenderer.swift; path = V2er/Sources/RichView/Renderers/MarkdownRenderer.swift; sourceTree = "<group>"; };
337338
72107B2148D16415A7512930 /* RichView+Preview.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RichView+Preview.swift"; path = "V2er/Sources/RichView/Views/RichView+Preview.swift"; sourceTree = "<group>"; };
338339
8366DEEFEB9819312F65353D /* RenderStylesheet.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RenderStylesheet.swift; path = V2er/Sources/RichView/Models/RenderStylesheet.swift; sourceTree = "<group>"; };
@@ -342,6 +343,7 @@
342343
CB3CC744901D9A994CF6ABE7 /* RenderError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RenderError.swift; path = V2er/Sources/RichView/Models/RenderError.swift; sourceTree = "<group>"; };
343344
D6356D706913919766FD0EA5 /* RenderActor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RenderActor.swift; path = V2er/Sources/RichView/Renderers/RenderActor.swift; sourceTree = "<group>"; };
344345
E205F350A3537A3E41B1AFC3 /* RichContentView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RichContentView.swift; path = V2er/Sources/RichView/Views/RichContentView.swift; sourceTree = "<group>"; };
346+
E43141D64D5C4A65B1700BF8 /* PostscriptItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostscriptItemView.swift; sourceTree = "<group>"; };
345347
/* End PBXFileReference section */
346348

347349
/* Begin PBXFrameworksBuildPhase section */
@@ -577,6 +579,7 @@
577579
5D6871812718717B00329E73 /* OtherSettingsView.swift */,
578580
5D6871852718761800329E73 /* FeedbackHelperView.swift */,
579581
5D6871872718764E00329E73 /* AboutView.swift */,
582+
63DD9090A3AEC64AF144E2CA /* CreditsPage.swift */,
580583
);
581584
path = Settings;
582585
sourceTree = "<group>";
@@ -982,16 +985,13 @@
982985
5D1D8E2226B1969B0040C418 /* CreateTopicPage.swift in Sources */,
983986
5DE62A2926CEB20E0082161A /* Extentions.swift in Sources */,
984987
5D54903326AB9E2200BB0CC0 /* SwiftUIView.swift in Sources */,
985-
5DE5B4CD268466D800569684 /* UpdatableView.swift in Sources */,
986988
5D1D8C0226EBA88C009DF65A /* UserDetailInfo.swift in Sources */,
987989
5DCE4CE6270BC683006BA98D /* UserFeedState.swift in Sources */,
988990
5D0CFA7C26B992B2001A8A7F /* MyFollowPage.swift in Sources */,
989991
5DE5C579249D90AD0004DCC6 /* Color.swift in Sources */,
990992
5D1CB5BC27244618002DB087 /* Nodes.swift in Sources */,
991-
5D02BD5F26909146007B6A1B /* LoadmoreIndicatorView.swift in Sources */,
992993
5D3CD31F26D0F5F600B3C2D3 /* BaseModel.swift in Sources */,
993994
5D6871862718761800329E73 /* FeedbackHelperView.swift in Sources */,
994-
5D38DEF5268C21A800C48F94 /* ActivityIndicator.swift in Sources */,
995995
5D3CD32126D0F9CC00B3C2D3 /* TabInfo.swift in Sources */,
996996
5D0A513F26E36F15006F3D9B /* FeedDetailActions.swift in Sources */,
997997
5DA2AD3726C17EB9007FB1EF /* AppState.swift in Sources */,
@@ -1006,14 +1006,12 @@
10061006
5D88D5DC26C2016000302265 /* ExploreReducer.swift in Sources */,
10071007
5DD2BA0027263E76004F357D /* SearchStateReducer.swift in Sources */,
10081008
5D2B2B3A26FF5DF800446F93 /* AccountInfo.swift in Sources */,
1009-
5D6AAAAA26917E7B00F42A13 /* Helper.swift in Sources */,
10101009
5D5EA3062741614700974E0F /* Headers.swift in Sources */,
10111010
5D68717E27186A6200329E73 /* AppearanceSettingView.swift in Sources */,
10121011
5D0A513D26E36AB9006F3D9B /* FeedDetailState.swift in Sources */,
10131012
5D1D8BFE26EBA857009DF65A /* UserDetailReducer.swift in Sources */,
10141013
5DF417742712DA7500E6D135 /* MyRecentState.swift in Sources */,
10151014
28B24CA92EA3460D00F82B2A /* BalanceView.swift in Sources */,
1016-
5DF92A5D26859DDD00E6086E /* HeadIndicatorView.swift in Sources */,
10171015
5D6AAAAC2691851100F42A13 /* Utils.swift in Sources */,
10181016
5D612FA126C7C34E0009B8F9 /* NetworkException.swift in Sources */,
10191017
5DE5B4CA2684601A00569684 /* TopBar.swift in Sources */,
@@ -1112,6 +1110,7 @@
11121110
484A41DB3858F1C84507E54B /* RenderActor.swift in Sources */,
11131111
1AEBC3AC5DAA63523F5448F5 /* RichContentView.swift in Sources */,
11141112
9495B5E175158F3646169AA5 /* RichContentView+Preview.swift in Sources */,
1113+
3AFEDD0981C882741CB19FCD /* CreditsPage.swift in Sources */,
11151114
);
11161115
runOnlyForDeploymentPostprocessing = 0;
11171116
};

V2er/View/Explore/SearchPage.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ struct SearchPage: StateView {
8383
HStack {
8484
Image(systemName: "magnifyingglass")
8585
.foregroundColor(.secondaryText)
86-
TextField("sov2ex", text: bindingState.keyword)
86+
TextField("Powered by sov2ex.com", text: bindingState.keyword)
8787
.disableAutocorrection(true)
8888
.autocapitalization(.none)
8989
.focused($focused)

V2er/View/MainPage.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,9 @@ struct MainPage: StateView {
8181

8282
// Message Tab
8383
MessagePage(selecedTab: state.selectedTab)
84+
.badge(unReadNums > 0 ? unReadNums : 0)
8485
.tabItem {
85-
if unReadNums > 0 {
86-
Label("通知", systemImage: "bell")
87-
.badge(unReadNums)
88-
} else {
89-
Label("通知", systemImage: "bell")
90-
}
86+
Label("通知", systemImage: "bell")
9187
}
9288
.tag(TabId.message)
9389

V2er/View/Message/MessagePage.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ struct MessageItemView: View {
9696
HStack(alignment: .top, spacing: 10) {
9797
AvatarView(url: item.avatar, size: 40)
9898
.to { UserDetailPage(userId: item.username)}
99-
VStack(alignment: .leading) {
99+
VStack(alignment: .leading, spacing: 4) {
100100
Text(item.title)
101101
.foregroundColor(Color.primaryText)
102102
.greedyWidth(.leading)
@@ -117,6 +117,11 @@ struct MessageItemView: View {
117117
.clipCorner(1.5, corners: [.topLeft, .bottomLeft])
118118
}
119119
.visibility(item.content.isEmpty ? .gone : .visible)
120+
if !item.time.isEmpty {
121+
Text(item.time)
122+
.font(.caption)
123+
.foregroundColor(Color.secondaryText)
124+
}
120125
}
121126
}
122127
.padding(12)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//
2+
// CreditsPage.swift
3+
// V2er
4+
//
5+
// Created by Claude on 2024.
6+
// Copyright © 2024 lessmore.io. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
import SafariServices
11+
12+
struct CreditsPage: View {
13+
@State private var safariURL: IdentifiableURL?
14+
15+
var body: some View {
16+
ScrollView {
17+
VStack(spacing: 0) {
18+
Button {
19+
if let url = URL(string: "https://sov2ex.com") {
20+
safariURL = IdentifiableURL(url: url)
21+
}
22+
} label: {
23+
SectionItemView("sov2ex.com", showDivider: false)
24+
.padding(.top, 8)
25+
}
26+
}
27+
}
28+
.navBar("致谢")
29+
.sheet(item: $safariURL) { item in
30+
SafariView(url: item.url)
31+
}
32+
}
33+
}
34+
35+
struct CreditsPage_Previews: PreviewProvider {
36+
static var previews: some View {
37+
CreditsPage()
38+
}
39+
}

V2er/View/Settings/SettingsPage.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ struct SettingsPage: View {
7272
SectionItemView("源码开放")
7373
}
7474

75+
SectionItemView("致谢")
76+
.to { CreditsPage() }
77+
7578
Button {
7679
if let url = URL(string: "https://v2er.app") {
7780
safariURL = IdentifiableURL(url: url)

0 commit comments

Comments
 (0)