Skip to content
Merged
Show file tree
Hide file tree
Changes from 11 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
14 changes: 14 additions & 0 deletions .github/workflows/assign-issue-creator.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# 각 레포지토리의 .github/workflows/assign-issue-creator.yml

name: Assign issue creator

on:
issues:
types: [opened]

jobs:
call-reusable-workflow:
# @main 은 .github 레포지토리의 main 브랜치를 사용한다는 의미입니다. 버전을 위해 @v1과 같이 태그를 사용하는 것을 권장합니다.
uses: 33-Auto/.github/.github/workflows/reusable-assign-issue-creator.yml@main
# 이 워크플로우는 secrets를 전달할 필요가 없지만, 필요 시 아래와 같이 전달합니다.
# secrets: inherit
19 changes: 19 additions & 0 deletions .github/workflows/close-issues-on-dev-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# 각 레포지토리의 .github/workflows/close-issues-on-dev-merge.yml

name: Auto Close Issues on dev merge

on:
pull_request:
types: [closed]

jobs:
call-reusable-workflow:
if: >
github.event.pull_request.merged == true &&
github.event.pull_request.base.ref == 'dev'
uses: 33-Auto/.github/.github/workflows/reusable-close-linked-issues.yml@main
# with를 통해 재사용 워크플로우의 inputs에 값을 전달합니다.
with:
pr-body: ${{ github.event.pull_request.body }}
issue-number: ${{ github.event.pull_request.number }}
secrets: inherit # 재사용 워크플로우가 GITHUB_TOKEN을 사용할 수 있도록 전달
17 changes: 17 additions & 0 deletions .github/workflows/request-pr-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# 각 레포지토리의 .github/workflows/request-pr-review.yml

name: PR Assignee & Team Review Request

on:
pull_request:
types: [opened, reopened, ready_for_review]

jobs:
call-reusable-workflow:
uses: 33-Auto/.github/.github/workflows/reusable-pr-assign-and-review.yml@main
with:
team-slug-for-review: "review_avengers" # 여기에 리뷰를 요청할 팀의 slug를 입력합니다.
pr-author: ${{ github.event.pull_request.user.login }}
pr-number: ${{ github.event.pull_request.number }}
secrets:
ORGANIZATION_TOKEN: ${{ secrets.ORGANIZATION_TOKEN }} # 재사용 워크플로우가 ORGANIZATION_TOKEN을 사용할 수 있도록 전달
62 changes: 62 additions & 0 deletions SampoomManagement.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,31 @@
objectVersion = 77;
objects = {

/* Begin PBXBuildFile section */
533528342E8BD99400F38FD1 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 533528332E8BD99400F38FD1 /* Alamofire */; };
5387CA3A2E8F676E005A3936 /* Swinject in Frameworks */ = {isa = PBXBuildFile; productRef = 5387CA392E8F676E005A3936 /* Swinject */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
53A7B4BF2E8A43AF00BC946E /* SampoomManagement.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SampoomManagement.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
533528372E8BDAB300F38FD1 /* Exceptions for "SampoomManagement" folder in "SampoomManagement" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Resources/Info.plist,
);
target = 53A7B4BE2E8A43AF00BC946E /* SampoomManagement */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
53A7B4C12E8A43AF00BC946E /* SampoomManagement */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
533528372E8BDAB300F38FD1 /* Exceptions for "SampoomManagement" folder in "SampoomManagement" target */,
);
path = SampoomManagement;
sourceTree = "<group>";
};
Expand All @@ -23,6 +41,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
533528342E8BD99400F38FD1 /* Alamofire in Frameworks */,
5387CA3A2E8F676E005A3936 /* Swinject in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -65,6 +85,8 @@
);
name = SampoomManagement;
packageProductDependencies = (
533528332E8BD99400F38FD1 /* Alamofire */,
5387CA392E8F676E005A3936 /* Swinject */,
);
productName = SampoomManagement;
productReference = 53A7B4BF2E8A43AF00BC946E /* SampoomManagement.app */;
Expand Down Expand Up @@ -94,6 +116,10 @@
);
mainGroup = 53A7B4B62E8A43AF00BC946E;
minimizedProjectReferenceProxies = 1;
packageReferences = (
533528322E8BD99400F38FD1 /* XCRemoteSwiftPackageReference "Alamofire" */,
5387CA382E8F676E005A3936 /* XCRemoteSwiftPackageReference "Swinject" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 53A7B4C02E8A43AF00BC946E /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -256,11 +282,13 @@
DEVELOPMENT_TEAM = B9PUAVBBKX;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "삼품관리";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -288,11 +316,13 @@
DEVELOPMENT_TEAM = B9PUAVBBKX;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_CFBundleDisplayName = "삼품관리";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
IPHONEOS_DEPLOYMENT_TARGET = 18.6;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
Expand Down Expand Up @@ -332,6 +362,38 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
533528322E8BD99400F38FD1 /* XCRemoteSwiftPackageReference "Alamofire" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Alamofire/Alamofire.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.10.2;
};
};
5387CA382E8F676E005A3936 /* XCRemoteSwiftPackageReference "Swinject" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Swinject/Swinject.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 2.10.0;
};
};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
533528332E8BD99400F38FD1 /* Alamofire */ = {
isa = XCSwiftPackageProductDependency;
package = 533528322E8BD99400F38FD1 /* XCRemoteSwiftPackageReference "Alamofire" */;
productName = Alamofire;
};
5387CA392E8F676E005A3936 /* Swinject */ = {
isa = XCSwiftPackageProductDependency;
package = 5387CA382E8F676E005A3936 /* XCRemoteSwiftPackageReference "Swinject" */;
productName = Swinject;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 53A7B4B72E8A43AF00BC946E /* Project object */;
}
146 changes: 146 additions & 0 deletions SampoomManagement/App/ContentView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
//
// ContentView.swift
// SampoomManagement
//
// Created by 채상윤 on 9/29/25.
//

import SwiftUI

enum Tabs {
case part, inventory, profile, setting, detail
}

struct ContentView: View {
@StateObject private var partViewModel: PartViewModel
@State private var selectedTab: Tabs = .part
@State var searchString = ""

init() {
// DI Container에서 ViewModel 주입
guard let viewModel = DIContainer.shared.resolve(PartViewModel.self) else {
fatalError("PartViewModel을 DIContainer에서 찾을 수 없습니다.")
}
_partViewModel = StateObject(wrappedValue: viewModel)
}

var body: some View {
TabView(selection: $selectedTab) {
// PartView 탭
Tab(StringResources.Tabs.parts, systemImage: "wrench.and.screwdriver", value: .part) {
PartView()
.environmentObject(partViewModel)
}

// InventoryView 탭 (임시)
Tab(StringResources.Tabs.inventory, systemImage: "cube.box", value: .inventory) {
NavigationView {
VStack(spacing: 20) {
Spacer()
Text(StringResources.Tabs.inventory)
.font(.largeTitle)
.fontWeight(.bold)
Text(StringResources.Placeholders.inventoryDescription)
.font(.body)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 32)
Spacer()
}
.navigationTitle(StringResources.Tabs.inventory)
}
}

// ProfileView 탭 (임시)
Tab(StringResources.Tabs.profile, systemImage: "person.circle", value: .profile) {
NavigationView {
VStack(spacing: 20) {
Spacer()
Text(StringResources.Tabs.profile)
.font(.largeTitle)
.fontWeight(.bold)
Text(StringResources.Placeholders.profileDescription)
.font(.body)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 32)
Spacer()
}
.navigationTitle(StringResources.Tabs.profile)
}
}

// SettingView 탭 (임시)
Tab(StringResources.Tabs.settings, systemImage: "gearshape", value: .setting) {
NavigationStack {
VStack(spacing: 20) {
Spacer()
Text(StringResources.Tabs.settings)
.font(.largeTitle)
.fontWeight(.bold)
Text(StringResources.Placeholders.settingsDescription)
.font(.body)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 32)
NavigationLink {
DetailView()
} label: {
Text(StringResources.Navigation.detail)
}
.buttonStyle(.borderedProminent)
Spacer()
}
.navigationTitle(StringResources.Tabs.settings)
}
}

Tab(value: .detail, role: .search) {
NavigationStack {
VStack {
Text(StringResources.Search.title)
.font(.largeTitle)
.fontWeight(.bold)
Text(StringResources.Placeholders.searchDescription)
.font(.body)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding(.horizontal, 32)
}
}
.navigationTitle(StringResources.Search.title)
.searchable(text: $searchString)
}
}
.accentColor(.blue)
}
}

struct DetailView: View {
var body: some View {
NavigationStack {
VStack {
Text(StringResources.Detail.screenTitle)
.font(.largeTitle)
.fontWeight(.bold)
.padding()

Text(StringResources.Detail.description)
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
.padding()

Spacer()
}
.navigationTitle(StringResources.Detail.title)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarTrailing) {
Button(StringResources.Navigation.close) {
// 닫기 액션
}
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ import SwiftUI

@main
struct SampoomManagementApp: App {

init() {
// DI Container 초기화
_ = DIContainer.shared
}

var body: some Scene {
WindowGroup {
ContentView()
Expand Down

This file was deleted.

24 changes: 0 additions & 24 deletions SampoomManagement/ContentView.swift

This file was deleted.

Loading