Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking โ€œSign up for GitHubโ€, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

๐Ÿ”€ :: [#170] ControlCenter ์œ„์ ฏ ์ถ”๊ฐ€ #171

Merged
merged 1 commit into from
Jan 12, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
# - AS PER https://guides.cocoapods.org/using/using-cocoapods.html NEVER IGNORE THE LOCK FILE
Pods/
GoogleService-Info.plist
GoogleService-QA-Info.plist
### fastlane ###
# fastlane - A streamlined workflow tool for Cocoa deployment
#
4 changes: 2 additions & 2 deletions Package.resolved
Original file line number Diff line number Diff line change
@@ -68,8 +68,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/groue/GRDB.swift.git",
"state" : {
"revision" : "77b85bed259b7f107710a0b78c439b1c5839dc45",
"version" : "6.26.0"
"revision" : "2cf6c756e1e5ef6901ebae16576a7e4e4b834622",
"version" : "6.29.3"
}
},
{
2 changes: 1 addition & 1 deletion Package.swift
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ let package = Package(
dependencies: [
.package(url: "https://github.com/pointfreeco/swift-composable-architecture", from: "1.7.0"),
.package(url: "https://github.com/SwiftyJSON/SwiftyJSON", from: "5.0.0"),
.package(url: "https://github.com/groue/GRDB.swift.git", from: "6.24.2"),
.package(url: "https://github.com/groue/GRDB.swift.git", from: "6.29.3"),
.package(url: "https://github.com/sindresorhus/LaunchAtLogin.git", from: "5.0.0"),
.package(url: "https://github.com/firebase/firebase-ios-sdk", from: "10.20.0"),
.package(url: "https://github.com/kean/Nuke.git", from: "12.4.0")
27 changes: 27 additions & 0 deletions Projects/App/Intents/TodayWhatAppOpenIntent.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import AppIntents

@available(iOS 16, *)
struct TodayWhatAppOpenIntent: OpenIntent {
static let title: LocalizedStringResource = "์˜ค๋Š˜ ๊ธ‰์‹/์‹œ๊ฐ„ํ‘œ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ"
static let description = IntentDescription("์˜ค๋Š˜๋ญ์ž„ ์•ฑ ์—ด๊ธฐ")

static var openAppWhenRun: Bool = true

@Parameter(title: "ํ™”๋ฉด ์œ„์น˜", default: .home)
var target: TodayWhatAppOpenControlAppEnum

func perform() async throws -> some IntentResult {
return .result()
}
}

@available(iOS 16, *)
enum TodayWhatAppOpenControlAppEnum: String, AppEnum {
case home

static let typeDisplayRepresentation = TypeDisplayRepresentation(name: "ํ™ˆ")

static let caseDisplayRepresentations: [TodayWhatAppOpenControlAppEnum: DisplayRepresentation] = [
.home: "Home"
]
}
10 changes: 5 additions & 5 deletions Projects/App/Project.swift
Original file line number Diff line number Diff line change
@@ -21,7 +21,7 @@ let settings: Settings = .settings(
defaultSettings: .recommended
)

let scripts: [TargetScript] = generateEnvironment.scripts
let scripts: [TargetScript] = [.swiftLint]

let targets: [Target] = [
.target(
@@ -31,10 +31,10 @@ let targets: [Target] = [
bundleId: "\(env.organizationName).\(env.name)",
deploymentTargets: .iOS("15.0"),
infoPlist: .file(path: "iOS/Support/Info.plist"),
sources: ["iOS/Sources/**"],
sources: ["iOS/Sources/**", "Intents/**"],
resources: ["iOS/Resources/**"],
entitlements: .file(path: "iOS/Support/TodayWhat.entitlements"),
scripts: scripts + [.firebaseCrashlytics],
scripts: generateEnvironment.iOSScripts,
dependencies: [
.feature(target: .RootFeature),
.shared(target: .KeychainClient),
@@ -51,7 +51,7 @@ let targets: [Target] = [
bundleId: "\(env.organizationName).\(env.name).TodayWhatWidget",
deploymentTargets: .iOS("15.0"),
infoPlist: .file(path: "iOS-Widget/Support/Info.plist"),
sources: ["iOS-Widget/Sources/**"],
sources: ["iOS-Widget/Sources/**", "Intents/**"],
resources: ["iOS-Widget/Resources/**"],
entitlements: .file(path: "iOS-Widget/Support/TodayWhatWidget.entitlements"),
scripts: scripts,
@@ -101,7 +101,7 @@ let targets: [Target] = [
sources: ["macOS/Sources/**"],
resources: ["macOS/Resources/**"],
entitlements: .file(path: "macOS/Support/TodayWhat_Mac_App.entitlements"),
scripts: scripts + [.launchAtLogin],
scripts: generateEnvironment.macOSScripts,
dependencies: [
.SPM.LaunchAtScreen,
.shared(target: .ComposableArchitectureWrapper),
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "rice_control_center.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import AppIntents
import SwiftUI
import WidgetKit

@available(iOSApplicationExtension 18.0, *)
struct MealControlWidget: ControlWidget {
static let kind: String = "TodayWhatMealControlWidget"

var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: MealControlWidget.kind,
provider: MealControlValueProvider()
) { value in
ControlWidgetButton(action: TodayWhatAppOpenIntent()) {
Label {
Text(value.partTime.display)
} icon: {
Image(systemName: "fork.knife")
}
}
}
}
}

struct MealControlValueProvider: ControlValueProvider {
struct Value {
let partTime: MealPartTime
}

var previewValue: Value = .init(
partTime: .breakfast
)

func currentValue() async throws -> Value {
let today = Date()
let partTime = MealPartTime(hour: today)
return .init(partTime: partTime)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import AppIntents
import SwiftUI
import WidgetKit

@available(iOSApplicationExtension 18.0, *)
struct TimeTableControlWidget: ControlWidget {
static let kind: String = "TodayWhatTimeTableControlWidget"

var body: some ControlWidgetConfiguration {
StaticControlConfiguration(
kind: TimeTableControlWidget.kind
) {
ControlWidgetButton(action: TodayWhatAppOpenIntent()) {
Label {
Text("์‹œ๊ฐ„ํ‘œ")
} icon: {
Image(systemName: "clock.fill")
}
}
}
}
}
5 changes: 5 additions & 0 deletions Projects/App/iOS-Widget/Sources/TodayWhatWidget.swift
Original file line number Diff line number Diff line change
@@ -14,6 +14,11 @@ struct TodayWhatWidget: WidgetBundle {
TodayWhatMealTimeTableWidget()
TodayWhatMealWidget()
TodayWhatTimeTableWidget()

if #available(iOS 18.0, *) {
MealControlWidget()
TimeTableControlWidget()
}
}
}

22 changes: 19 additions & 3 deletions Tuist/ProjectDescriptionHelpers/Action/Action+Template.swift
Original file line number Diff line number Diff line change
@@ -22,14 +22,30 @@ public extension TargetScript {
name: "Launch At Login Helper"
)

static let firebaseInfoByConfiguration = TargetScript.post(
static let firebaseInfoByIOSConfiguration = TargetScript.post(
script: """
case "${CONFIGURATION}" in
"Release" )
cp -r "$SRCROOT/Resources/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
cp -r "$SRCROOT/iOS/Resources/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
;;
*)
cp -r "$SRCROOT/Resources/GoogleService-QA-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
cp -r "$SRCROOT/iOS/Resources/GoogleService-QA-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
;;
esac

""",
name: "Firebase Info copy by Configuration",
basedOnDependencyAnalysis: false
)

static let firebaseInfoByMacOSConfiguration = TargetScript.post(
script: """
case "${CONFIGURATION}" in
"Release" )
cp -r "$SRCROOT/macOS/Resources/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
;;
*)
cp -r "$SRCROOT/macOS/Resources/GoogleService-QA-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
;;
esac

19 changes: 16 additions & 3 deletions Tuist/ProjectDescriptionHelpers/GenerateEnvironment.swift
Original file line number Diff line number Diff line change
@@ -12,16 +12,29 @@ let environment = ProcessInfo.processInfo.environment["TUIST_ENV"] ?? ""
public let generateEnvironment = GenerateEnvironment(rawValue: environment) ?? .dev

public extension GenerateEnvironment {
var scripts: [TargetScript] {
var iOSScripts: [TargetScript] {
switch self {
case .ci:
return []

case .cd:
return [.firebaseInfoByConfiguration]
return [.firebaseInfoByIOSConfiguration, .firebaseCrashlytics]

case .dev:
return [.swiftLint, .firebaseInfoByConfiguration]
return [.swiftLint, .firebaseCrashlytics, .firebaseInfoByIOSConfiguration]
}
}

var macOSScripts: [TargetScript] {
switch self {
case .ci:
return [.launchAtLogin]

case .cd:
return [.firebaseInfoByMacOSConfiguration, .launchAtLogin]

case .dev:
return [.swiftLint, .firebaseInfoByMacOSConfiguration, .launchAtLogin]
}
}
}
Original file line number Diff line number Diff line change
@@ -33,7 +33,7 @@ public extension Project {
additionalFiles: [FileElement] = [],
configurations: [Configuration] = []
) -> Project {
let scripts: [TargetScript] = generateEnvironment.scripts
let scripts: [TargetScript] = [.swiftLint]
let ldFlagsSettings: SettingsDictionary = product == .framework ?
["OTHER_LDFLAGS": .string("$(inherited) -all_load")] :
["OTHER_LDFLAGS": .string("$(inherited)")]
2 changes: 1 addition & 1 deletion Tuist/ProjectDescriptionHelpers/Target/TargetSpec.swift
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ public struct TargetSpec: Configurable {
copyFiles: [CopyFilesAction]? = nil,
headers: Headers? = nil,
entitlements: Entitlements? = nil,
scripts: [TargetScript] = generateEnvironment.scripts,
scripts: [TargetScript] = [.swiftLint],
dependencies: [TargetDependency] = [],
settings: Settings? = nil,
coreDataModels: [CoreDataModel] = [],

Unchanged files with check annotations Beta

import Foundation
import GRDB
// swiftlint: disable identifier_name

Check warning on line 6 in Projects/Shared/LocalDatabaseClient/Sources/LocalDatabaseClient.swift

GitHub Actions / swiftlint

Superfluous Disable Command Violation: SwiftLint rule 'identifier_name' did not trigger a violation in the disabled region; remove the disable command (superfluous_disable_command)

Check warning on line 6 in Projects/Shared/LocalDatabaseClient/Sources/LocalDatabaseClient.swift

GitHub Actions / swiftlint

Superfluous Disable Command Violation: SwiftLint rule 'identifier_name' did not trigger a violation in the disabled region; remove the disable command (superfluous_disable_command)
public struct LocalDatabaseClient {
private let dbQueue: DatabaseQueue
private var migrator = DatabaseMigrator()
public extension LocalDatabaseClient {
// swiftlint: disable force_try
init(migrate: (inout DatabaseMigrator) -> Void) {

Check warning on line 85 in Projects/Shared/LocalDatabaseClient/Sources/LocalDatabaseClient.swift

GitHub Actions / swiftlint

Function Body Length Violation: Function body should span 50 lines or less excluding comments and whitespace: currently spans 73 lines (function_body_length)

Check warning on line 85 in Projects/Shared/LocalDatabaseClient/Sources/LocalDatabaseClient.swift

GitHub Actions / swiftlint

Function Body Length Violation: Function body should span 50 lines or less excluding comments and whitespace: currently spans 73 lines (function_body_length)
var url: URL
#if os(macOS)
url = try! FileManager.default.url(
import Foundation
#endif
// swiftlint: disable identifier_name type_body_length file_length cyclomatic_complexity function_body_length

Check warning on line 9 in Projects/Shared/DeviceUtil/Sources/Device.swift

GitHub Actions / swiftlint

Superfluous Disable Command Violation: SwiftLint rule 'identifier_name' did not trigger a violation in the disabled region; remove the disable command (superfluous_disable_command)

Check warning on line 9 in Projects/Shared/DeviceUtil/Sources/Device.swift

GitHub Actions / swiftlint

Superfluous Disable Command Violation: SwiftLint rule 'identifier_name' did not trigger a violation in the disabled region; remove the disable command (superfluous_disable_command)
public enum Device {
#if os(iOS)
case iPodTouch5
guard let url = urlComponents.url else { throw TodayWhatError.failedToFetch }
let (data, _) = try await URLSession.shared.data(from: url)
let json = try JSON(data: data)
guard let _ = json["RESULT"].null else {

Check warning on line 24 in Projects/Shared/NeisClient/Sources/NeisClient.swift

GitHub Actions / swiftlint

Unused Optional Binding Violation: Prefer `!= nil` over `let _ =` (unused_optional_binding)

Check warning on line 24 in Projects/Shared/NeisClient/Sources/NeisClient.swift

GitHub Actions / swiftlint

Unused Optional Binding Violation: Prefer `!= nil` over `let _ =` (unused_optional_binding)
throw TodayWhatError.failedToFetch
}
var info = json[key].arrayValue
}
public var body: some View {
WithViewStore(store, observe: { $0 }) { viewStore in

Check warning on line 30 in Projects/Feature/SchoolSettingFeature/Sources/SchoolSettingView.swift

GitHub Actions / swiftlint

Multiple Closures with Trailing Closure Violation: Trailing closure syntax should not be used when passing more than one closure argument (multiple_closures_with_trailing_closure)

Check warning on line 30 in Projects/Feature/SchoolSettingFeature/Sources/SchoolSettingView.swift

GitHub Actions / swiftlint

Multiple Closures with Trailing Closure Violation: Trailing closure syntax should not be used when passing more than one closure argument (multiple_closures_with_trailing_closure)
ZStack {
VStack(spacing: 16) {
if !viewStore.isFocusedSchool {
.sorted { $0.perio < $1.perio }
.map(\.content)
case .timeTableResponse(.failure(_)):

Check warning on line 77 in Projects/Feature/ModifyTimeTableFeature/Sources/ModifyTimeTableCore.swift

GitHub Actions / swiftlint

Empty Enum Arguments Violation: Arguments can be omitted when matching enums with associated values if they are not used (empty_enum_arguments)

Check warning on line 77 in Projects/Feature/ModifyTimeTableFeature/Sources/ModifyTimeTableCore.swift

GitHub Actions / swiftlint

Empty Enum Arguments Violation: Arguments can be omitted when matching enums with associated values if they are not used (empty_enum_arguments)
state.isLoading = false
state.inputedTimeTables = []
case alert(PresentationAction<Alert>)
case confirmationDialog(PresentationAction<ConfirmationDialog>)
public enum Alert: Equatable, Sendable {

Check warning on line 51 in Projects/Feature/SettingsFeature/Sources/SettingsCore.swift

GitHub Actions / swiftlint

Nesting Violation: Types should be nested at most 1 level deep (nesting)

Check warning on line 51 in Projects/Feature/SettingsFeature/Sources/SettingsCore.swift

GitHub Actions / swiftlint

Nesting Violation: Types should be nested at most 1 level deep (nesting)
case githubIssueButtonDidTap
case mailIssueButtonDidTap
}
public enum ConfirmationDialog: Equatable, Sendable {

Check warning on line 56 in Projects/Feature/SettingsFeature/Sources/SettingsCore.swift

GitHub Actions / swiftlint

Nesting Violation: Types should be nested at most 1 level deep (nesting)

Check warning on line 56 in Projects/Feature/SettingsFeature/Sources/SettingsCore.swift

GitHub Actions / swiftlint

Nesting Violation: Types should be nested at most 1 level deep (nesting)
case githubIssueButtonDidTap
case mailIssueButtonDidTap
}
!code.isEmpty,
let orgCode = userDefaultsClient.getValue(.orgCode) as? String,
!orgCode.isEmpty,
userDefaultsClient.getValue(.grade) as? Int != nil,

Check warning on line 27 in Projects/Feature/SplashFeature/Sources/SplashCore.swift

GitHub Actions / swiftlint

Prefer Type Checking Violation: Prefer `a is X` to `a as? X != nil` (prefer_type_checking)

Check warning on line 27 in Projects/Feature/SplashFeature/Sources/SplashCore.swift

GitHub Actions / swiftlint

Prefer Type Checking Violation: Prefer `a is X` to `a as? X != nil` (prefer_type_checking)
userDefaultsClient.getValue(.class) as? Int != nil,

Check warning on line 28 in Projects/Feature/SplashFeature/Sources/SplashCore.swift

GitHub Actions / swiftlint

Prefer Type Checking Violation: Prefer `a is X` to `a as? X != nil` (prefer_type_checking)

Check warning on line 28 in Projects/Feature/SplashFeature/Sources/SplashCore.swift

GitHub Actions / swiftlint

Prefer Type Checking Violation: Prefer `a is X` to `a as? X != nil` (prefer_type_checking)
let school = userDefaultsClient.getValue(.school) as? String,
!school.isEmpty,
let type = userDefaultsClient.getValue(.schoolType) as? String,