Skip to content

Commit 025f32c

Browse files
committed
feature: implements models screen
1 parent 8252918 commit 025f32c

File tree

5 files changed

+179
-0
lines changed

5 files changed

+179
-0
lines changed

sample/ios/YChatApp/App/Presenter/Home/HomeView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ internal struct HomeView: View {
2020
NavigationStack {
2121
Group {
2222
switch selectedMenu {
23+
case .models: ModelsView()
2324
case .chatCompletions: ChatCompletionsView()
2425
default: Feedback(state: .construction)
2526
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
//
2+
// ModelsView.swift
3+
// Y-Chat
4+
//
5+
// Created by Koji Osugi on 11/04/23.
6+
// Copyright © 2023 orgName. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
11+
struct ModelsView: View {
12+
@ObservedObject
13+
private var viewModel: ModelsViewModel
14+
15+
init(viewModel: ModelsViewModel = .init()) {
16+
self.viewModel = viewModel
17+
viewModel.fetchListModels()
18+
}
19+
20+
var body: some View {
21+
VStack(spacing: 0) {
22+
switch viewModel.state {
23+
case .loading:
24+
Spacer()
25+
ProgressView()
26+
Spacer()
27+
case .error:
28+
Spacer()
29+
Feedback(state: .error, onAction: { viewModel.fetchListModels() })
30+
Spacer()
31+
case .success(let models):
32+
ScrollView {
33+
ForEach(models, id: \.self) {
34+
ItemMenu(startText: $0.id, caption: $0.ownedBy)
35+
}.padding(.top, 16)
36+
}
37+
}
38+
}
39+
.fullScreen()
40+
}
41+
}
42+
43+
struct ModelsView_Previews: PreviewProvider {
44+
static var previews: some View {
45+
NavigationStack {
46+
ModelsView()
47+
.applyToolbar("Models", startIcon: .menu)
48+
}
49+
}
50+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//
2+
// ModelsViewModel.swift
3+
// Y-Chat
4+
//
5+
// Created by Koji Osugi on 11/04/23.
6+
// Copyright © 2023 orgName. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import YChat
11+
12+
internal class ModelsViewModel: ObservableObject {
13+
private var listModels: ListModels {
14+
YChatCompanion.shared.create(apiKey: Config.apiKey)
15+
.listModels()
16+
}
17+
18+
@Published
19+
var state: State = .loading
20+
21+
@MainActor
22+
func fetchListModels() {
23+
Task.init {
24+
state = .loading
25+
do {
26+
let result = try await listModels.execute()
27+
state = .success(result)
28+
} catch {
29+
state = .error
30+
}
31+
}
32+
}
33+
34+
enum State {
35+
case success([AIModel])
36+
case loading
37+
case error
38+
}
39+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//
2+
// ItemMenu.swift
3+
// Y-Chat
4+
//
5+
// Created by Koji Osugi on 11/04/23.
6+
// Copyright © 2023 orgName. All rights reserved.
7+
//
8+
9+
import SwiftUI
10+
11+
struct ItemMenu: View {
12+
var startText: String
13+
var caption: String
14+
var isDividerVisible: Bool = true
15+
16+
var body: some View {
17+
VStack {
18+
VStack(alignment: .leading, spacing: 4) {
19+
Text(startText)
20+
.style(.mediumBody)
21+
Text(caption)
22+
.foregroundColor(Color.text2)
23+
.style(.smallBody)
24+
}
25+
.padding(.horizontal, 16)
26+
.padding(.vertical, 14)
27+
.frame(maxWidth: .infinity, alignment: .leading)
28+
if isDividerVisible {
29+
Divider().padding(.horizontal, 16)
30+
}
31+
}
32+
}
33+
}
34+
35+
struct ItemMenu_Previews: PreviewProvider {
36+
static var previews: some View {
37+
VStack(spacing: 0) {
38+
ItemMenu(
39+
startText: "Line 1",
40+
caption: "Caption 1"
41+
)
42+
ItemMenu(
43+
startText: "Line 2",
44+
caption: "Caption 2"
45+
)
46+
ItemMenu(
47+
startText: "Line 3",
48+
caption: "Caption 3",
49+
isDividerVisible: false
50+
)
51+
}
52+
}
53+
}

sample/ios/ychat-ios.xcodeproj/project.pbxproj

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
486C6F7D29E088EA006E427E /* ButtonContained.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F7C29E088EA006E427E /* ButtonContained.swift */; };
1919
486C6F8029E08D46006E427E /* TypingLoading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F7F29E08D46006E427E /* TypingLoading.swift */; };
2020
486C6F8329E11316006E427E /* BallonMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F8229E11316006E427E /* BallonMessage.swift */; };
21+
486C6F8A29E612D0006E427E /* ItemMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F8929E612D0006E427E /* ItemMenu.swift */; };
22+
486C6F8D29E61520006E427E /* ModelsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F8C29E61520006E427E /* ModelsView.swift */; };
23+
486C6F9029E615A6006E427E /* ModelsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 486C6F8F29E615A6006E427E /* ModelsViewModel.swift */; };
2124
488448D9297B8419005B8A24 /* ChatCompletionsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 488448D8297B8419005B8A24 /* ChatCompletionsViewModel.swift */; };
2225
488448DD297B8DD2005B8A24 /* Color.swift in Sources */ = {isa = PBXBuildFile; fileRef = 488448DC297B8DD2005B8A24 /* Color.swift */; };
2326
488448DF297B8DF6005B8A24 /* Typography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 488448DE297B8DF6005B8A24 /* Typography.swift */; };
@@ -63,6 +66,9 @@
6366
486C6F7C29E088EA006E427E /* ButtonContained.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonContained.swift; sourceTree = "<group>"; };
6467
486C6F7F29E08D46006E427E /* TypingLoading.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypingLoading.swift; sourceTree = "<group>"; };
6568
486C6F8229E11316006E427E /* BallonMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BallonMessage.swift; sourceTree = "<group>"; };
69+
486C6F8929E612D0006E427E /* ItemMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemMenu.swift; sourceTree = "<group>"; };
70+
486C6F8C29E61520006E427E /* ModelsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelsView.swift; sourceTree = "<group>"; };
71+
486C6F8F29E615A6006E427E /* ModelsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelsViewModel.swift; sourceTree = "<group>"; };
6672
488448D8297B8419005B8A24 /* ChatCompletionsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatCompletionsViewModel.swift; sourceTree = "<group>"; };
6773
488448DC297B8DD2005B8A24 /* Color.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Color.swift; sourceTree = "<group>"; };
6874
488448DE297B8DF6005B8A24 /* Typography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typography.swift; sourceTree = "<group>"; };
@@ -140,6 +146,31 @@
140146
path = BallonMessage;
141147
sourceTree = "<group>";
142148
};
149+
486C6F8829E612C4006E427E /* ItemMenu */ = {
150+
isa = PBXGroup;
151+
children = (
152+
486C6F8929E612D0006E427E /* ItemMenu.swift */,
153+
);
154+
path = ItemMenu;
155+
sourceTree = "<group>";
156+
};
157+
486C6F8B29E61515006E427E /* Models */ = {
158+
isa = PBXGroup;
159+
children = (
160+
486C6F8E29E61599006E427E /* ViewModel */,
161+
486C6F8C29E61520006E427E /* ModelsView.swift */,
162+
);
163+
path = Models;
164+
sourceTree = "<group>";
165+
};
166+
486C6F8E29E61599006E427E /* ViewModel */ = {
167+
isa = PBXGroup;
168+
children = (
169+
486C6F8F29E615A6006E427E /* ModelsViewModel.swift */,
170+
);
171+
path = ViewModel;
172+
sourceTree = "<group>";
173+
};
143174
488448DA297B8D19005B8A24 /* App */ = {
144175
isa = PBXGroup;
145176
children = (
@@ -173,6 +204,7 @@
173204
488448E1297B8EF9005B8A24 /* Component */ = {
174205
isa = PBXGroup;
175206
children = (
207+
486C6F8829E612C4006E427E /* ItemMenu */,
176208
486C6F8129E11309006E427E /* BallonMessage */,
177209
486C6F7E29E08D39006E427E /* Loading */,
178210
486C6F7729E0844B006E427E /* Feedback */,
@@ -233,6 +265,7 @@
233265
488448F7297CDFB1005B8A24 /* Features */ = {
234266
isa = PBXGroup;
235267
children = (
268+
486C6F8B29E61515006E427E /* Models */,
236269
488448EB297CAC28005B8A24 /* ChatCompletions */,
237270
);
238271
path = Features;
@@ -471,6 +504,7 @@
471504
486C6F8029E08D46006E427E /* TypingLoading.swift in Sources */,
472505
488448DF297B8DF6005B8A24 /* Typography.swift in Sources */,
473506
488448E3297B8F1B005B8A24 /* DefaultTextFieldStyle.swift in Sources */,
507+
486C6F9029E615A6006E427E /* ModelsViewModel.swift in Sources */,
474508
488448D9297B8419005B8A24 /* ChatCompletionsViewModel.swift in Sources */,
475509
48844905297CE094005B8A24 /* TransitionAnimation.swift in Sources */,
476510
4884490D297CE1E6005B8A24 /* HomeView.swift in Sources */,
@@ -484,6 +518,7 @@
484518
486C6F7B29E086C0006E427E /* ButtonOutlined.swift in Sources */,
485519
486C6F7629E08207006E427E /* LogoSplash.swift in Sources */,
486520
488448F1297CD209005B8A24 /* ImageButton.swift in Sources */,
521+
486C6F8A29E612D0006E427E /* ItemMenu.swift in Sources */,
487522
486C6F7929E08456006E427E /* Feedback.swift in Sources */,
488523
488448FF297CE035005B8A24 /* AppRouter.swift in Sources */,
489524
488448F6297CDF67005B8A24 /* SideMenu.swift in Sources */,
@@ -493,6 +528,7 @@
493528
488448E6297B9116005B8A24 /* RoundedCorner.swift in Sources */,
494529
489A546D297F93F700A6532C /* Config.swift in Sources */,
495530
486C6F7D29E088EA006E427E /* ButtonContained.swift in Sources */,
531+
486C6F8D29E61520006E427E /* ModelsView.swift in Sources */,
496532
488448FC297CE004005B8A24 /* SplashView.swift in Sources */,
497533
);
498534
runOnlyForDeploymentPostprocessing = 0;

0 commit comments

Comments
 (0)