Conversation
Contributor
There was a problem hiding this comment.
Pull Request Overview
This PR introduces a toast notification system to replace direct router-based navigation with a message-passing architecture using typed notification messages. The implementation adds SwiftUtility and DependenciesUtility modules to support scoped task subscriptions and type-safe NotificationCenter messaging.
Key changes:
- Added toast UI component with automatic dismissal and optional action buttons
- Replaced router dependencies with NotificationCenter-based message passing for navigation coordination
- Implemented scoped task subscriptions that automatically cancel when owner is deallocated
Reviewed Changes
Copilot reviewed 31 out of 31 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| ContentViewModel.swift | Replaced TimetableRouter and LectureSearchRouter dependencies with notificationCenter subscription to NavigateToVacancyMessage |
| ContentViewModel+URLScheme.swift | Converted URL scheme handlers to post typed notification messages instead of directly manipulating router state |
| ContentView.swift | Added .overlayToast() modifier to enable toast presentation throughout the app |
| Project.swift | Added SwiftUtility and DependenciesUtility module dependencies to multiple targets |
| TaskSubscribeTests.swift | Added comprehensive test coverage for scoped task lifecycle and cancellation behavior |
| ScopedTask.swift | Implemented Task.scoped extension for automatic task cancellation when owner is deallocated |
| NotificationCenter+TypedMessage.swift | Created type-safe wrapper for NotificationCenter with TypedMessage protocol |
| ToastView.swift | Implemented toast item view with button support and preview examples |
| ToastModel.swift | Defined Toast and ToastButton data models with Sendable conformance |
| ToastContainer.swift | Created view model for managing toast presentation queue and auto-dismissal |
| Toast+Modifier.swift | Added overlayToast() view modifier and environment key for toast presentation |
| AnimatableTabView.swift | Updated to sync selectedTab binding with tab controller selection |
| NotificationMessage.swift (TimetableInterface) | Defined navigation message types for timetable-related deeplinks |
| TimetableScene.swift | Removed LectureSearchRouter dependency from initialization |
| LectureEditDetailScene.swift | Added presentToast environment value for bookmark/vacancy notifications |
| LectureEditDetailScene+Toolbar.swift | Implemented toast notifications when toggling bookmark/vacancy features |
| ExpandableLectureCell.swift | Added toast notifications with navigation actions for bookmark/vacancy operations |
| TimetableViewModel.swift | Replaced router dependency with notification subscriptions for lecture navigation |
| LectureSearchViewModel.swift | Removed LectureSearchRouter dependency, replaced with NavigateToBookmarkMessage subscription |
| LectureEditDetailViewModel.swift | Added SharedUIComponents import for Toast types |
| Localizable.strings (en/Base) | Added localized strings for toast messages |
| ThemeViewModel.swift | Migrated from NotificationCenter.default to typed message subscription |
| ThemeDetailViewModel.swift | Converted theme update notification to typed message |
| NotificationMessage.swift (Themes) | Defined CustomThemeDidUpdateMessage type |
| SettingsScene.swift | Made NavigationStack path bindable for programmatic navigation |
| SettingsViewModel.swift | Added subscription to NavigateToVacancyMessage for navigation to vacancy settings |
| FriendsScene.swift | Removed manual notification task subscription (moved to view model) |
| NotificationMessage.swift (Friends) | Defined typed messages for Kakao friend requests and menu opening |
| FriendsViewModel.swift | Added notification subscriptions for OpenFriendsMenuMessage and KakaoFriendRequestMessage |
| FriendsViewModel+KakaoRequest.swift | Removed notification stream helper and extension documentation |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
.../Modules/Feature/Timetable/Sources/UI/LectureEditDetail/LectureEditDetailScene+Toolbar.swift
Outdated
Show resolved
Hide resolved
.../Modules/Feature/Timetable/Sources/UI/LectureEditDetail/LectureEditDetailScene+Toolbar.swift
Outdated
Show resolved
Hide resolved
SNUTT/Modules/Feature/Friends/Sources/Presentation/FriendsViewModel.swift
Outdated
Show resolved
Hide resolved
SNUTT/Modules/Shared/SharedUIComponents/Sources/AnimatableTabView/AnimatableTabView.swift
Show resolved
Hide resolved
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.