Skip to content

Commit 8919d54

Browse files
authored
Merge pull request #5 from LunaticMuch/feat/v2
feat: new UI
2 parents 9744757 + e1dee59 commit 8919d54

18 files changed

+258
-641
lines changed

.swiftlint.yml

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
disabled_rules:
2+
- identifier_name
3+
- type_name
4+
- cyclomatic_complexity
5+
excluded:
6+
- .vscode/*

Redhill Weather.xcodeproj/project.pbxproj

+54-59
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{
2+
"originHash" : "991dabb0b94544a13586e1235cf180b673bf74cdfc5351cc3c8309df8f8e398d",
23
"pins" : [
34
{
45
"identity" : "datehelper",
@@ -8,16 +9,7 @@
89
"revision" : "76d0840daab7288fc99b04a4c23d504f0394e083",
910
"version" : "5.0.1"
1011
}
11-
},
12-
{
13-
"identity" : "refreshablescrollview",
14-
"kind" : "remoteSourceControl",
15-
"location" : "https://github.com/phuhuynh2411/RefreshableScrollView",
16-
"state" : {
17-
"revision" : "e06edf5dc4facc7fbf71179e8a94f0d1c7035ce3",
18-
"version" : "1.1.1"
19-
}
2012
}
2113
],
22-
"version" : 2
14+
"version" : 3
2315
}

Redhill Weather/Controllers/Controller.swift

-55
This file was deleted.

Redhill Weather/Extensions/Date+Extension.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import Foundation
99

1010
extension Date {
11-
11+
1212
static func - (lhs: Date, rhs: Date) -> TimeInterval {
1313
return lhs.timeIntervalSinceReferenceDate - rhs.timeIntervalSinceReferenceDate
1414
}
15-
15+
1616
}

Redhill Weather/Extensions/String+Extension.swift

+3-3
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,17 @@ extension String {
1111
func index(from: Int) -> Index {
1212
return self.index(startIndex, offsetBy: from)
1313
}
14-
14+
1515
func substring(from: Int) -> String {
1616
let fromIndex = index(from: from)
1717
return String(self[fromIndex...])
1818
}
19-
19+
2020
func substring(to: Int) -> String {
2121
let toIndex = index(from: to)
2222
return String(self[..<toIndex])
2323
}
24-
24+
2525
func substring(with r: Range<Int>) -> String {
2626
let startIndex = index(from: r.lowerBound)
2727
let endIndex = index(from: r.upperBound)

Redhill Weather/Helpers/Helpers.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func cloudCoverage(_ cover: Int) -> String {
1717
}
1818
}
1919

20-
func decodeWeather (_ codedMetar:String) -> String {
20+
func decodeWeather (_ codedMetar: String) -> String {
2121
var decoded: String = ""
2222
switch codedMetar.count {
2323
case 5: decoded += decodeWeatherCode(codedMetar.substring(with: 0..<1)) + " "
@@ -36,7 +36,7 @@ func decodeWeather (_ codedMetar:String) -> String {
3636
}
3737

3838
// The decoder of weather codes
39-
fileprivate func decodeWeatherCode (_ code:String) -> String {
39+
private func decodeWeatherCode (_ code: String) -> String {
4040
switch code {
4141
case "VC": return "In the vicinity"
4242
case "MI": return "Shallow"

Redhill Weather/Models/Model.swift

+35-159
Original file line numberDiff line numberDiff line change
@@ -7,178 +7,54 @@
77

88
import Foundation
99

10-
// MARK: - This struct is a real mess. It is a bit of outrageous code but the starting point, ie the JSON returned by the API,
11-
12-
// is bad, undocumented and frankly not even nicely modelled.
13-
14-
struct Metar: Decodable {
15-
var siteId: String
10+
struct RedhillAtis: Decodable {
11+
var site: String
1612
var metar: String
1713
var designator: String
1814
var runway: String
1915
var updatedOn: String
20-
var isAutomatic: Bool
21-
var isCavok: Bool
16+
// var isAutomatic: Bool
17+
// var isCavok: Bool
2218
var qfe: Int
2319
var qnh: Int
24-
var temperature: Int
25-
var dewPoint: Int
26-
var visibility: Int
27-
var clouds: [CloudCoverage]
28-
var isWindVariable: Bool
29-
var windSpeed: Int
30-
var windBetweenFrom: Int
31-
var windDirection: Int
32-
var windBetweenTo: Int
33-
var windSpeedGust: Int
34-
var weather: String
35-
36-
struct CloudCoverage: Decodable {
37-
var type: Int = 0
38-
var height: Int = 0
39-
var cover: Int = 0
40-
}
41-
42-
enum OuterKeys: String, CodingKey {
43-
case siteId
44-
case reports
45-
}
46-
47-
enum ReportsKeys: String, CodingKey {
48-
case metarReport
49-
}
50-
51-
// "Reports"."metarReport"
52-
enum MetarReportKeys: String, CodingKey {
53-
case auto, arrivalAtis, time, temperature, cloud, cavok, qnh, airfieldQfe, visibility, weather
54-
}
55-
56-
enum VisibilityKeys: String, CodingKey {
57-
case visibility
58-
}
59-
60-
enum TemperatureKeys: String, CodingKey {
61-
case temperature, dewPoint
62-
}
63-
64-
enum WeatherKeys: String, CodingKey {
65-
case fullReportString
66-
}
67-
68-
enum CloudKeys: String, CodingKey {
69-
case cloudLayer1, cloudLayer2, cloudLayer3
70-
}
71-
72-
// "Reports"."metarReport"."temperature"
73-
enum MetarKeys: String, CodingKey {
74-
case cloud
75-
}
76-
77-
enum ArrivalAtisKeys: String, CodingKey {
78-
case codeLetter, runway, metReportString, wind
79-
}
80-
81-
enum WindKeys: String, CodingKey {
82-
case wind2Min
83-
}
84-
85-
enum RecentWindContainer: String, CodingKey {
86-
case isVrb, averageWindSpeed, averageWindDirection, minimumWindDirection, maximumWindDirection, maximumWindSpeed
87-
}
88-
89-
init(from decoder: Decoder) throws {
90-
let outerContainer = try decoder.container(keyedBy: OuterKeys.self)
91-
let reportsContainer = try outerContainer.nestedContainer(keyedBy: ReportsKeys.self, forKey: .reports)
92-
self.siteId = try outerContainer.decode(String.self, forKey: .siteId)
93-
94-
// METAR information
95-
let metarContainer = try reportsContainer.nestedContainer(keyedBy: MetarReportKeys.self, forKey: .metarReport)
96-
self.updatedOn = try metarContainer.decode(String.self, forKey: .time)
97-
self.isCavok = try metarContainer.decode(Bool.self, forKey: .cavok)
98-
self.isAutomatic = try metarContainer.decode(Bool.self, forKey: .auto)
99-
self.qnh = try metarContainer.decode(Int.self, forKey: .qnh)
100-
self.qfe = try metarContainer.decode(Int.self, forKey: .airfieldQfe)
101-
102-
// Arrival ATIS
103-
let arrivalAtisContainer = try metarContainer.nestedContainer(keyedBy: ArrivalAtisKeys.self, forKey: .arrivalAtis)
104-
self.metar = try arrivalAtisContainer.decode(String.self, forKey: .metReportString)
105-
self.designator = try arrivalAtisContainer.decode(String.self, forKey: .codeLetter)
106-
self.runway = try arrivalAtisContainer.decode(String.self, forKey: .runway)
107-
108-
// Temperature
109-
let temperatureContainer = try metarContainer.nestedContainer(keyedBy: TemperatureKeys.self, forKey: .temperature)
110-
self.temperature = try temperatureContainer.decode(Int.self, forKey: .temperature)
111-
self.dewPoint = try temperatureContainer.decode(Int.self, forKey: .dewPoint)
112-
113-
// Visibility - This is returned nil when CAVOK
114-
if self.isCavok == false {
115-
let visibilityContainer = try metarContainer.nestedContainer(keyedBy: VisibilityKeys.self, forKey: .visibility)
116-
self.visibility = try visibilityContainer.decode(Int.self, forKey: .visibility)
117-
} else { self.visibility = 9999 }
20+
// var temperature: Int
21+
// var dewPoint: Int
22+
// var visibility: Int
23+
// var clouds: [CloudCoverage]
24+
// var isWindVariable: Bool
25+
// var windSpeed: Int
26+
// var windBetweenFrom: Int
27+
// var windDirection: Int
28+
// var windBetweenTo: Int
29+
// var windSpeedGust: Int
30+
// var weather: String
31+
//
32+
// struct CloudCoverage: Decodable {
33+
// var type: Int = 0
34+
// var height: Int = 0
35+
// var cover: Int = 0
36+
// }
11837

119-
// Weather
120-
let weatherContainer = try metarContainer.nestedContainer(keyedBy: WeatherKeys.self, forKey: .weather)
121-
self.weather = try weatherContainer.decode(String.self, forKey: .fullReportString)
122-
123-
// Clouds
124-
let cloudContainer = try metarContainer.nestedContainer(keyedBy: CloudKeys.self, forKey: .cloud)
125-
self.clouds = [CloudCoverage]()
126-
127-
if let cloud1 = try? cloudContainer.decode(CloudCoverage.self, forKey: .cloudLayer1) {
128-
self.clouds.append(cloud1)
129-
}
130-
131-
if let cloud2 = try? cloudContainer.decode(CloudCoverage.self, forKey: .cloudLayer2) {
132-
self.clouds.append(cloud2)
133-
}
134-
135-
if let cloud3 = try? cloudContainer.decode(CloudCoverage.self, forKey: .cloudLayer3) {
136-
self.clouds.append(cloud3)
137-
}
138-
139-
// Wind
140-
let windContainer = try arrivalAtisContainer.nestedContainer(keyedBy: WindKeys.self, forKey: .wind)
141-
let recentWindContainer = try windContainer.nestedContainer(keyedBy: RecentWindContainer.self, forKey: .wind2Min)
142-
self.windSpeed = try recentWindContainer.decode(Int.self, forKey: .averageWindSpeed)
143-
self.isWindVariable = try recentWindContainer.decode(Bool.self, forKey: .isVrb)
144-
145-
if let windFrom = try? recentWindContainer.decode(Int.self, forKey: .minimumWindDirection) {
146-
self.windBetweenFrom = windFrom
147-
} else
148-
{ self.windBetweenFrom = 0 }
149-
150-
if let windTo = try? recentWindContainer.decode(Int.self, forKey: .minimumWindDirection) {
151-
self.windBetweenTo = windTo
152-
} else
153-
{ self.windBetweenTo = 0 }
154-
155-
self.windSpeedGust = try recentWindContainer.decode(Int.self, forKey: .maximumWindSpeed)
156-
if let windDirection = try? recentWindContainer.decode(Int.self, forKey: .averageWindDirection) {
157-
self.windDirection = windDirection
158-
} else
159-
{ self.windDirection = 0 }
160-
}
161-
16238
init() {
163-
self.siteId = ""
39+
self.site = ""
16440
self.metar = ""
16541
self.designator = ""
16642
self.runway = ""
16743
self.updatedOn = ""
168-
self.isAutomatic = true
169-
self.isCavok = true
44+
// self.isAutomatic = true
45+
// self.isCavok = true
17046
self.qfe = 0
17147
self.qnh = 0
172-
self.temperature = 0
173-
self.dewPoint = 0
174-
self.visibility = 0
175-
self.clouds = []
176-
self.isWindVariable = false
177-
self.windSpeed = 0
178-
self.windDirection = 0
179-
self.windBetweenFrom = 0
180-
self.windBetweenTo = 0
181-
self.windSpeedGust = 0
182-
self.weather = ""
48+
// self.temperature = 0
49+
// self.dewPoint = 0
50+
// self.visibility = 0
51+
// self.clouds = []
52+
// self.isWindVariable = false
53+
// self.windSpeed = 0
54+
// self.windDirection = 0
55+
// self.windBetweenFrom = 0
56+
// self.windBetweenTo = 0
57+
// self.windSpeedGust = 0
58+
// self.weather = ""
18359
}
18460
}

Redhill Weather/Redhill_WeatherApp.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import SwiftUI
99

1010
@main
11-
struct Redhill_WeatherApp: App {
11+
struct RedhillWeatherApp: App {
1212
var body: some Scene {
1313
WindowGroup {
1414
MainView()
@@ -19,14 +19,14 @@ struct Redhill_WeatherApp: App {
1919
struct MainView: View {
2020
var body: some View {
2121
TabView {
22-
ContentView()
22+
AtisView()
2323
.tabItem {
24-
Label("Weather", systemImage: "cloud.sun.rain.fill")
24+
Label("ATIS", systemImage: "cloud.sun.rain.fill")
2525
}
26-
27-
InfoView()
26+
27+
SettingsView()
2828
.tabItem {
29-
Label("Info", systemImage: "info.circle.fill")
29+
Label("Settings", systemImage: "gearshape.fill")
3030
}
3131
}
3232
}

0 commit comments

Comments
 (0)