Skip to content

Commit d83ac90

Browse files
authored
Merge pull request #175 from makinosp/develop
Develop
2 parents e3fca00 + 55df761 commit d83ac90

File tree

5 files changed

+68
-54
lines changed

5 files changed

+68
-54
lines changed

README.md

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,43 @@
33

44
[![License](https://img.shields.io/github/license/makinosp/harmonie.svg)](https://img.shields.io/github/license/makinosp/harmonie.svg)
55
[![Release](https://img.shields.io/github/release/makinosp/harmonie.svg)](https://img.shields.io/github/release/makinosp/harmonie.svg)
6-
![Swift](https://img.shields.io/badge/Swift%205.9+-F05138?logo=Swift&logoColor=white)
6+
![Swift](https://img.shields.io/badge/Swift%206.0+-F05138?logo=Swift&logoColor=white)
77
![Platform](https://img.shields.io/badge/platforms-iOS%2017.0%2b%20%7C%20iPadOS%2017.0%2b-lightgrey.svg)
88
[![Codacy Badge](https://app.codacy.com/project/badge/Grade/24e487375b114c83ae937e4e93f3a5c3)](https://app.codacy.com/gh/makinosp/harmonie/dashboard)
99

1010
<div align="center">
1111
<a href="https://github.com/makinosp/harmonie">
1212
<img
13-
src="https://github.com/user-attachments/assets/fbc45e79-1822-4eb8-9098-6bed772409a8"
14-
height="240"
13+
src="https://github.com/user-attachments/assets/161ede10-b0bf-4796-966b-be1727f5fbc1"
14+
height="128"
1515
alt="Harmonie Icon"
1616
>
1717
</a>
18-
<p>A native iOS app for VRChat API made with SwiftUI</p>
18+
<p>Unofficial VRChat Social Navigator for iOS</p>
1919
</div>
2020

2121
## Description
2222

23-
This is a native iOS application developed entirely with Swift. The app allows users to manage friends, view friends' locations, and organize favorites, offering a seamless and efficient user experience.
23+
This is an unofficial VRChat social navigator application for iOS, built entirely with Swift/SwiftUI for a smooth and native experience.
24+
The app allows users to manage friends, view friends' locations, and organize favorites. Please note that this app is not affiliated with or endorsed by VRChat.
2425

2526
## Features
2627

27-
### Locations
28+
### Location Tracking
2829

29-
### Friends
30+
The location tracking feature lets users can see which VRChat worlds their friends are visiting. This allows users to stay informed about their friends’ activities and helps them discover new places to explore together within the VRChat environment.
3031

31-
### Favorites
32+
### Friend Management
33+
34+
The friend management feature lets users can view their friends’ online status and see where they are currently located in the VRChat universe. This feature helps users stay connected and engaged with their friends.
35+
36+
### Favorites Management
37+
38+
The favorites management feature lets users organize and access their preferred worlds and friends quickly. Users can easily add, remove, or browse their favorites.
39+
40+
## System Requirements
41+
42+
This app is compatible with iOS 17 or iPadOS 17 or later. It can run on iPhone and iPad models that support these operating systems. In addition, this app can run as an iPad app on a Mac with Apple silicon.
3243

3344
## License
3445

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
//
2+
// ExternalLink.swift
3+
// Harmonie
4+
//
5+
// Created by makinosp on 2024/10/26.
6+
//
7+
8+
import MemberwiseInit
9+
import SwiftUI
10+
11+
@MemberwiseInit
12+
struct ExternalLink {
13+
@State private var isPresentedAlert = false
14+
@Init(.internal) private let title: String
15+
@Init(.internal) private let url: URL
16+
@Init(.internal) private let systemImage: String
17+
}
18+
19+
extension ExternalLink: View {
20+
var body: some View {
21+
Button {
22+
isPresentedAlert.toggle()
23+
} label: {
24+
LabeledContent {
25+
IconSet.linkExternal.icon
26+
.imageScale(.small)
27+
.foregroundStyle(Color(.tertiaryLabel))
28+
} label: {
29+
Label(title, systemImage: systemImage)
30+
.lineLimit(1)
31+
}
32+
}
33+
.alert("Opening URL", isPresented: $isPresentedAlert) {
34+
Button("Cancel", role: .cancel) {}
35+
Link("OK", destination: url)
36+
} message: {
37+
Text(verbatim: url.absoluteString)
38+
}
39+
}
40+
}

harmonie/Localization/Localizable.xcstrings

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1284,16 +1284,6 @@
12841284
}
12851285
}
12861286
},
1287-
"The URL below will be opened" : {
1288-
"localizations" : {
1289-
"ja" : {
1290-
"stringUnit" : {
1291-
"state" : "translated",
1292-
"value" : "下記のURLを開きます"
1293-
}
1294-
}
1295-
}
1296-
},
12971287
"Third Party Licence" : {
12981288
"localizations" : {
12991289
"ja" : {

harmonie/Views/Setting/AboutSection.swift

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import SwiftUI
99

1010
extension SettingsView {
1111
struct AboutSection: View {
12-
@State private var isPresentedAlert = false
1312
var body: some View {
1413
Section("About This App") {
1514
NavigationLabel {
@@ -20,27 +19,12 @@ extension SettingsView {
2019
}
2120
}
2221
.tag(SettingsDestination.about)
23-
if let sourceCodeUrl = URL(string: "https://github.com/makinosp/harmonie") {
24-
Button {
25-
isPresentedAlert.toggle()
26-
} label: {
27-
LabeledContent {
28-
IconSet.linkExternal.icon
29-
.imageScale(.small)
30-
.foregroundStyle(Color(.tertiaryLabel))
31-
} label: {
32-
Label("Source Code", systemImage: IconSet.code.systemName)
33-
}
34-
}
35-
.alert("Opening URL", isPresented: $isPresentedAlert) {
36-
Button("Cancel", role: .cancel) {}
37-
Link("OK", destination: sourceCodeUrl)
38-
} message: {
39-
VStack {
40-
Text("The URL below will be opened")
41-
Text(sourceCodeUrl.absoluteString)
42-
}
43-
}
22+
if let url = URL(string: "https://github.com/makinosp/harmonie") {
23+
ExternalLink(
24+
title: String(localized: "Source Code"),
25+
url: url,
26+
systemImage: IconSet.code.systemName
27+
)
4428
}
4529
NavigationLabel {
4630
Label {

harmonie/Views/UserDetail/UserDetailView+SocialLinksSection.swift

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,11 @@ extension UserDetailView {
1212
func socialLinksSection(_ urls: [URL]) -> some View {
1313
GroupBox("Social Links") {
1414
DividedVStack(alignment: .leading) {
15-
ForEach(urls) { url in socialLink(url) }
15+
ForEach(urls) { url in
16+
ExternalLink(title: url.description, url: url, systemImage: IconSet.link.systemName)
17+
}
1618
}
1719
}
1820
.groupBoxStyle(.card)
1921
}
20-
21-
private func socialLink(_ url: URL) -> Link<some View> {
22-
Link(destination: url) {
23-
LabeledContent {
24-
IconSet.linkExternal.icon
25-
.imageScale(.small)
26-
.foregroundStyle(Color(.tertiaryLabel))
27-
} label: {
28-
Label(url.description, systemImage: IconSet.link.systemName)
29-
.lineLimit(1)
30-
}
31-
}
32-
}
3322
}

0 commit comments

Comments
 (0)