Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
97 commits
Select commit Hold shift + click to select a range
91fb4d7
[FEAT] 로그인 회원가입 구현
Yoo-Hyuna Oct 9, 2025
d0e5d24
Merge pull request #2 from StockMate-Hyundai/feat/#1
rhkr8521 Oct 10, 2025
cf10ea0
[FEAT] 탭바 커스터마이징
Yoo-Hyuna Oct 11, 2025
271d654
[CHORE] remove xcuserdata from tracking and update .gitignore
Yoo-Hyuna Oct 11, 2025
39f295d
[FEAT] 홈화면 UI 구현 및 공통 색상 추가
Yoo-Hyuna Oct 12, 2025
97cd466
[FEAT] 재고관리화면 UI 구현
Yoo-Hyuna Oct 14, 2025
5fc9887
[FEAT] 사용자 정보 API 연동
Yoo-Hyuna Oct 14, 2025
1c29c30
[FEAT] 재고관리 UI 수정
Yoo-Hyuna Oct 15, 2025
e620117
[SETTING] 코드 리뷰 적용
Yoo-Hyuna Oct 15, 2025
aaffc0b
Merge pull request #4 from StockMate-Hyundai/feat/#3
Yoo-Hyuna Oct 15, 2025
2c09be6
[SETTING] 이슈 자동 종료 등록
rhkr8521 Oct 15, 2025
cbd3885
[FEAT] 재고 조회 API 연결
Yoo-Hyuna Oct 16, 2025
8392a16
[FEAT] 재고관리 탭 부족재고 API 연동 및 UI 수정
Yoo-Hyuna Oct 16, 2025
f9f066c
[FEAT] 재고관리 탭 부품이름 검색 API 연결 및 UI 수정
Yoo-Hyuna Oct 17, 2025
05d7375
[FIX] 재고관리 탭 버그 수정
Yoo-Hyuna Oct 17, 2025
b202240
[FIX] 재고검색 페이 버그 수정
Yoo-Hyuna Oct 17, 2025
3b00a93
[FIX] 재고검색 페이지 버그 수정
Yoo-Hyuna Oct 17, 2025
ad06779
[FIX] 재고검색 페이지 버그 수정
Yoo-Hyuna Oct 17, 2025
b5325df
Revert "[FIX] 재고검색 페이지 버그 수정"
Yoo-Hyuna Oct 19, 2025
8185e13
Revert "[FIX] 재고검색 페이지 버그 수정"
Yoo-Hyuna Oct 19, 2025
8b8b5ba
[FEAT] 재고검색 페이지 로직 변경
Yoo-Hyuna Oct 20, 2025
910feb5
[FIX] 재고검색 페이지 검색어 공백 제거
Yoo-Hyuna Oct 20, 2025
4568a32
Merge pull request #6 from StockMate-Hyundai/feat/#5
Yoo-Hyuna Oct 20, 2025
c562252
[FEAT] 주문내역, 주문 상세페이지 구현
Yoo-Hyuna Oct 22, 2025
deabaac
[FEAT] 재고관리 탭 디자인 수정
Yoo-Hyuna Oct 22, 2025
7e2cc33
[FEAT] 홈화면 재고 부족 조회 api 연결 및 디자인 수정
Yoo-Hyuna Oct 23, 2025
26a5420
[FEAT] 발주탭 장바구니 api 연동 및 장바구니 기능 구현
Yoo-Hyuna Oct 25, 2025
a71c9e7
[REFAC] 발주탭 장바구니 보기 버튼 리팩토링
Yoo-Hyuna Oct 27, 2025
96e8227
[FEAT] 직접발주 구현
Yoo-Hyuna Oct 27, 2025
70fc04f
[FEAT] 장바구니 리스트 기능 구현
Yoo-Hyuna Oct 27, 2025
bb0d3b8
[FEAT] 주문 결제 UI 구현
Yoo-Hyuna Oct 27, 2025
126e853
[FEAT] 주문 생성 API 연결
Yoo-Hyuna Oct 28, 2025
f50860e
[FEAT] 주문 생성 API 수정
Yoo-Hyuna Oct 28, 2025
a8e18bf
[FEAT] 영수증 UI 디자인
Yoo-Hyuna Oct 28, 2025
861febc
[CHORE] 파일 정리
Yoo-Hyuna Oct 29, 2025
234e9e2
[FIX] 주석제거 및 위험요소 수정
Yoo-Hyuna Oct 29, 2025
fbcbb2a
Merge pull request #8 from StockMate-Hyundai/feat/#7
Yoo-Hyuna Oct 29, 2025
232e53d
[FEAT] 주문 상세 페이지 및 영수증 수정
Yoo-Hyuna Oct 29, 2025
384bbf5
Merge branch 'feat/#9' of https://github.com/StockMate-Hyundai/iOS in…
Yoo-Hyuna Oct 29, 2025
4405f9b
[FEAT] 주문 상세 페이지 예치금 충전 API 연동,배송정보 UI 추가 및 배송상태 수정
Yoo-Hyuna Oct 30, 2025
e01f5cc
[CHORE] svg 파일 single scale로 변경
Yoo-Hyuna Oct 30, 2025
23e2adf
[FIX] 코드리뷰 반영
Yoo-Hyuna Oct 31, 2025
259efb0
[REFAC] 주문 상세 화면 배치 수정
Yoo-Hyuna Oct 31, 2025
4b9715c
Merge pull request #10 from StockMate-Hyundai/feat/#9
Yoo-Hyuna Oct 31, 2025
3c1d65b
[REFAC] 주문생성 API 응답구조 수정
Yoo-Hyuna Oct 31, 2025
2f74924
[FEAT] 입고/사용 QR 처리 기능 추가
Yoo-Hyuna Oct 31, 2025
f3789bf
Merge branch 'feat/#11' of https://github.com/StockMate-Hyundai/iOS i…
Yoo-Hyuna Oct 31, 2025
574be77
[CHORE] 로그인 정규식 활성화
Yoo-Hyuna Nov 1, 2025
00022da
Merge pull request #12 from StockMate-Hyundai/feat/#11
Yoo-Hyuna Nov 1, 2025
484984b
[FEAT] 입출고 히스토리 구현
Yoo-Hyuna Nov 2, 2025
ab2d4fa
[FIX] 주문 상태 enum 변경에 따른 매핑 수정
Yoo-Hyuna Nov 2, 2025
f8330b0
[FEAT] 홈화면 지출현황 중간 코드 저장
Yoo-Hyuna Nov 2, 2025
79ca35e
[FEAT] 홈화면 파이차트 중간 저장
Yoo-Hyuna Nov 3, 2025
40ef1db
[FEAT] 홈화면 대시보드 기능 구현
Yoo-Hyuna Nov 3, 2025
72deb00
[FEAT] 홈화면 대시보드 기능 구현
Yoo-Hyuna Nov 3, 2025
92a5c27
[FEAT] 에치금 히스토리 임시 저장
Yoo-Hyuna Nov 3, 2025
f2246cd
[FEAT] 부품 상세 조회 api 연결
Yoo-Hyuna Nov 3, 2025
c64204b
[FEAT] 부품 사용처리 기능 구현 임시 저장
Yoo-Hyuna Nov 3, 2025
5edc05f
[FEAT] 부품 사용처리 기능 구현 임시 저장
Yoo-Hyuna Nov 3, 2025
e4ee734
[FEAT] 부품 사용처리 기능 구현
Yoo-Hyuna Nov 3, 2025
2d5a3da
[FEAT] 부품 사용처리 구현
Yoo-Hyuna Nov 4, 2025
9e1805d
[REFAC] 입출고 히스토리 시간대 수정
Yoo-Hyuna Nov 4, 2025
1b8843c
[REFAC] 버튼 리팩터링 및 스켈레톤 UI 적용
Yoo-Hyuna Nov 4, 2025
43d3d93
[FEAT] 마이페이지 구현
Yoo-Hyuna Nov 5, 2025
58b8fc0
[FEAT] 회원가입 시 카카오 우편번호 조회 기능 추가
Yoo-Hyuna Nov 5, 2025
c8419f9
[FEAT] 예치금 히스토리 기능 임시저장
Yoo-Hyuna Nov 6, 2025
5bcbaf8
[FEAT] 예치금 히스토리 기능 구현
Yoo-Hyuna Nov 6, 2025
9db5ff8
[FEAT] 예치금 히스토리 기능 구현
Yoo-Hyuna Nov 6, 2025
d813871
[REFAC] stausText 및 마이페이지 수정
Yoo-Hyuna Nov 7, 2025
5ceb482
[REFAC] 코드리뷰 적용
Yoo-Hyuna Nov 7, 2025
26fe712
[REFAC] 코드리뷰 적용
Yoo-Hyuna Nov 7, 2025
bebaee0
Merge pull request #14 from StockMate-Hyundai/feat/#13
Yoo-Hyuna Nov 7, 2025
8078475
[FEAT] 알림 기능 구현
Yoo-Hyuna Nov 8, 2025
c6a39ca
Merge branch 'feat/#15' of https://github.com/StockMate-Hyundai/iOS i…
Yoo-Hyuna Nov 8, 2025
2092887
[REFAC] 코드리뷰 적용
Yoo-Hyuna Nov 8, 2025
8274d9d
[REFAC] 코드리뷰 적용
Yoo-Hyuna Nov 8, 2025
a47ae58
Merge pull request #16 from StockMate-Hyundai/feat/#15
Yoo-Hyuna Nov 8, 2025
de6e351
[REFAC] 막대그래프 크기 수정
Yoo-Hyuna Nov 8, 2025
04b8a70
[REFAC] 부족 재고 페이지 상단 탭 수정
Yoo-Hyuna Nov 8, 2025
c5cfa15
[REFAC] 상단바 뒤로가기 버튼 수정
Yoo-Hyuna Nov 8, 2025
630ac48
[REFAC] 수량조절 공통 컴포넌트화 및 장바구니 ui 수정
Yoo-Hyuna Nov 8, 2025
bf0123e
[REFAC] 수량조절 공통 컴포넌트화 및 장바구니 ui 수정
Yoo-Hyuna Nov 8, 2025
4198d58
[REFAC] 재고 필터링 UI 수정
Yoo-Hyuna Nov 8, 2025
f484565
[REFAC] 재고탭 플로팅 버튼 수정
Yoo-Hyuna Nov 9, 2025
3a62b31
[FEAT] 화면 터치 시 키보드 자동 숨김 기능 추가
Yoo-Hyuna Nov 9, 2025
f8c2c67
[STYLE] 결제 페이지 안드로이드와 일관성 유지
Yoo-Hyuna Nov 9, 2025
2017216
[STYLE] 영수증 페이지 안드로이드와 일관성 유지
Yoo-Hyuna Nov 9, 2025
6abb58d
[REFAC] 주문 내역 상세: 요청사항이 있는 경우만 요청사항 영역을 보여주도록 수정
Yoo-Hyuna Nov 9, 2025
d8cf1f4
[REFAC] 주문 내역 상세: 입고처리 버튼 기능 연결 및 재주문하기 버튼 삭제
Yoo-Hyuna Nov 9, 2025
3fc46e3
[REFAC] 영수증 폭 수정
Yoo-Hyuna Nov 9, 2025
d47b069
[FEAT] 토스트 메세지 추가
Yoo-Hyuna Nov 9, 2025
44a664b
[REFAC] 예치금 페이지 안드로이드와 일관성 유지
Yoo-Hyuna Nov 9, 2025
c972bcc
[REFAC] 주문상세 안드로이드와 일관성 유지
Yoo-Hyuna Nov 9, 2025
44ee0d2
[REFAC] 안드로이드와 디자인 일관성 유지
Yoo-Hyuna Nov 10, 2025
c20c01f
[REFAC] 안드로이드와 디자인 통일, 앱로고 및 스플래시 화면 추가
Yoo-Hyuna Nov 10, 2025
36862d5
[CHORE] 주석 추가 및 코드 정리
Yoo-Hyuna Nov 12, 2025
7654f3b
Merge pull request #18 from StockMate-Hyundai/feat/#17
Yoo-Hyuna Nov 12, 2025
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
15 changes: 15 additions & 0 deletions .github/coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
language: "ko-KR"

reviews:
profile: "chill"
request_changes_workflow: false
high_level_summary: true
poem: false
review_status: true
auto_review:
enabled: true
drafts: false
branches:
include:
- main
- dev
45 changes: 45 additions & 0 deletions .github/workflows/close-dev-issue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Auto Close Issues on dev merge

permissions:
issues: write

on:
pull_request:
types: [closed]

jobs:
close-issues:
if: >
github.event.pull_request.merged == true &&
github.event.pull_request.base.ref == 'dev'
runs-on: ubuntu-latest

steps:
- name: Close linked issues
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const prBody = context.payload.pull_request.body;
const issueLines = prBody.split('\n');

// 클로징 키워드가 있는 줄에서만 이슈 번호 추출
const closingKeywords = ['close', 'closes', 'closed', 'fix', 'fixes', 'fixed', 'resolve', 'resolves', 'resolved'];
const issuePattern = /#(\d+)/g;

for (const line of issueLines) {
const lower = line.toLowerCase();
if (closingKeywords.some(k => lower.includes(k))) {
let match;
while ((match = issuePattern.exec(line)) !== null) {
const issue_number = parseInt(match[1]);
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number,
state: 'closed'
});
console.log(`✅ Closed issue #${issue_number}`);
}
}
}
6 changes: 5 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,8 @@ DerivedData/
Pods/

# Swift Package Manager
Packages/
Packages/

# Xcode user state files
*.xcuserstate
*.xcuserdata/
Binary file modified StockMate/.DS_Store
Binary file not shown.
55 changes: 53 additions & 2 deletions StockMate/StockMate.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,30 @@
objectVersion = 77;
objects = {

/* Begin PBXBuildFile section */
84BB0A832E94E09700A08CD6 /* Alamofire in Frameworks */ = {isa = PBXBuildFile; productRef = 84BB0A822E94E09700A08CD6 /* Alamofire */; };
/* End PBXBuildFile section */

/* Begin PBXFileReference section */
84BB0A132E91FE0E00A08CD6 /* StockMate.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StockMate.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */

/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
84BB0D3C2EB49C0900A08CD6 /* Exceptions for "StockMate" folder in "StockMate" target */ = {
isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
membershipExceptions = (
Info.plist,
);
target = 84BB0A122E91FE0E00A08CD6 /* StockMate */;
};
/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */

/* Begin PBXFileSystemSynchronizedRootGroup section */
84BB0A152E91FE0E00A08CD6 /* StockMate */ = {
isa = PBXFileSystemSynchronizedRootGroup;
exceptions = (
84BB0D3C2EB49C0900A08CD6 /* Exceptions for "StockMate" folder in "StockMate" target */,
);
path = StockMate;
sourceTree = "<group>";
};
Expand All @@ -23,6 +40,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
84BB0A832E94E09700A08CD6 /* Alamofire in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -65,6 +83,7 @@
);
name = StockMate;
packageProductDependencies = (
84BB0A822E94E09700A08CD6 /* Alamofire */,
);
productName = StockMate;
productReference = 84BB0A132E91FE0E00A08CD6 /* StockMate.app */;
Expand Down Expand Up @@ -94,6 +113,9 @@
);
mainGroup = 84BB0A0A2E91FE0E00A08CD6;
minimizedProjectReferenceProxies = 1;
packageReferences = (
84BB0A812E94E09700A08CD6 /* XCRemoteSwiftPackageReference "Alamofire" */,
);
preferredProjectObjectVersion = 77;
productRefGroup = 84BB0A142E91FE0E00A08CD6 /* Products */;
projectDirPath = "";
Expand Down Expand Up @@ -249,10 +271,14 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 35TSG7VB2B;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = StockMate/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "QR 코드를 스캔하기 위해 카메라 접근이 필요합니다.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
Expand All @@ -263,8 +289,9 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.StockMate;
PRODUCT_BUNDLE_IDENTIFIER = com.hyuna.StockMate;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
Expand All @@ -276,10 +303,14 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 35TSG7VB2B;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = StockMate/Info.plist;
INFOPLIST_KEY_NSCameraUsageDescription = "QR 코드를 스캔하기 위해 카메라 접근이 필요합니다.";
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
Expand All @@ -290,8 +321,9 @@
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.example.StockMate;
PRODUCT_BUNDLE_IDENTIFIER = com.hyuna.StockMate;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
Expand Down Expand Up @@ -320,6 +352,25 @@
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */

/* Begin XCRemoteSwiftPackageReference section */
84BB0A812E94E09700A08CD6 /* XCRemoteSwiftPackageReference "Alamofire" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Alamofire/Alamofire.git";
requirement = {
kind = upToNextMajorVersion;
minimumVersion = 5.10.2;
};
};
/* End XCRemoteSwiftPackageReference section */

/* Begin XCSwiftPackageProductDependency section */
84BB0A822E94E09700A08CD6 /* Alamofire */ = {
isa = XCSwiftPackageProductDependency;
package = 84BB0A812E94E09700A08CD6 /* XCRemoteSwiftPackageReference "Alamofire" */;
productName = Alamofire;
};
/* End XCSwiftPackageProductDependency section */
};
rootObject = 84BB0A0B2E91FE0E00A08CD6 /* Project object */;
}
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "5EC6B344-CC57-4454-99DC-C9A0FEDD44E7"
type = "1"
version = "2.0">
</Bucket>
24 changes: 18 additions & 6 deletions StockMate/StockMate/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,29 @@
import SwiftUI

struct ContentView: View {
@State private var address: String = "주소를 선택하세요"
@State private var showWebView = false

var body: some View {
VStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
VStack(spacing: 20) {
Text(address)
.font(.title3)
.multilineTextAlignment(.center)
.padding()

Button("주소 검색") {
showWebView.toggle()
}
.font(.headline)
.buttonStyle(.borderedProminent)
}
.sheet(isPresented: $showWebView) {
KakaoZipCodeView(address: $address)
}
.padding()
}
}


#Preview {
ContentView()
}
5 changes: 5 additions & 0 deletions StockMate/StockMate/Info.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
</plist>
19 changes: 18 additions & 1 deletion StockMate/StockMate/app/StockMateApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,26 @@ import SwiftUI

@main
struct StockMateApp: App {
@StateObject private var authViewModel = AuthViewModel()
@State private var isLoading = true // 인트로 상태

var body: some Scene {
WindowGroup {
ContentView()

Group {
if isLoading {
IntroView() // 로고만 보여주는 화면
} else {
AppNavHost()
.environmentObject(authViewModel)
}
}
.onAppear {
Task {
try await Task.sleep(nanoseconds: 1_500_000_000) // 1.5초
isLoading = false
}
}
}
}
}
80 changes: 80 additions & 0 deletions StockMate/StockMate/app/core/KakaoPostcode/KakaoZipCodeVC.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
//
// KakaoZipCodeVC.swift
// StockMate
//
// Created by Admin on 11/5/25.
//


import UIKit
import WebKit

class KakaoZipCodeVC: UIViewController {

// MARK: - Properties
var webView: WKWebView?
let indicator = UIActivityIndicatorView(style: .medium)
var onAddressSelected: ((String) -> Void)? // SwiftUI로 결과 전달용 콜백

override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
setupWebView()
setupLayout()
}

private func setupWebView() {
let contentController = WKUserContentController()
contentController.add(self, name: "callBackHandler")

let config = WKWebViewConfiguration()
config.userContentController = contentController

webView = WKWebView(frame: .zero, configuration: config)
webView?.navigationDelegate = self

guard let webView = webView,
let url = URL(string: "https://yoo-hyuna.github.io/Kakao-Postcode/") else { return }

webView.load(URLRequest(url: url))
}

private func setupLayout() {
guard let webView = webView else { return }
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false

webView.addSubview(indicator)
indicator.translatesAutoresizingMaskIntoConstraints = false

NSLayoutConstraint.activate([
webView.topAnchor.constraint(equalTo: view.topAnchor),
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
webView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
webView.bottomAnchor.constraint(equalTo: view.bottomAnchor),

indicator.centerXAnchor.constraint(equalTo: webView.centerXAnchor),
indicator.centerYAnchor.constraint(equalTo: webView.centerYAnchor)
])
}
}

extension KakaoZipCodeVC: WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController,
didReceive message: WKScriptMessage) {
guard let data = message.body as? [String: Any] else { return }
let address = data["roadAddress"] as? String ?? ""
onAddressSelected?(address) // SwiftUI로 전달
dismiss(animated: true)
}
}

extension KakaoZipCodeVC: WKNavigationDelegate {
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
indicator.startAnimating()
}

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
indicator.stopAnimating()
}
}
31 changes: 31 additions & 0 deletions StockMate/StockMate/app/core/KakaoPostcode/KakaoZipCodeView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
//
// KakaoZipCodeView.swift
// StockMate
//
// Created by Admin on 11/5/25.
//


import SwiftUI
import WebKit

// SwiftUI에서 UIKit 기반의 Kakao 우편번호 검색 화면을 사용하기 위한 래퍼 뷰
// UIViewControllerRepresentable을 통해 KakaoZipCodeVC를 SwiftUI에 통합
struct KakaoZipCodeView: UIViewControllerRepresentable {
// 선택된 주소 값을 SwiftUI와 바인딩
@Binding var address: String

// KakaoZipCodeVC 생성 및 초기 설정
func makeUIViewController(context: Context) -> KakaoZipCodeVC {
let vc = KakaoZipCodeVC()

// 주소가 선택되었을 때 SwiftUI 바인딩 변수로 전달
vc.onAddressSelected = { selectedAddress in
address = selectedAddress
}
return vc
}

// UIViewController 상태 갱신 (현재는 별도 갱신 로직 없음)
func updateUIViewController(_ uiViewController: KakaoZipCodeVC, context: Context) {}
}
Loading