diff --git a/Packages/PicMatch/Package.swift b/Packages/PicMatch/Package.swift index f6c3b7a9..e481f74d 100644 --- a/Packages/PicMatch/Package.swift +++ b/Packages/PicMatch/Package.swift @@ -10,309 +10,327 @@ let package = Package( .iOS("16.4"), ], products: [ - .library(name: "AchievementFeature", targets: ["AchievementFeature"]), - .library(name: "AppFeature", targets: ["AppFeature"]), - .library(name: "BannedFeature", targets: ["BannedFeature"]), - .library(name: "BannerFeature", targets: ["BannerFeature"]), - .library(name: "DeleteAccountFeature", targets: ["DeleteAccountFeature"]), - .library(name: "DirectMessageFeature", targets: ["DirectMessageFeature"]), - .library(name: "DirectMessageTabFeature", targets: ["DirectMessageTabFeature"]), - .library(name: "DisplayNameSettingFeature", targets: ["DisplayNameSettingFeature"]), - .library(name: "ExplorerFeature", targets: ["ExplorerFeature"]), - .library(name: "ForceUpdateFeature", targets: ["ForceUpdateFeature"]), - .library(name: "FreezedFeature", targets: ["FreezedFeature"]), - .library(name: "GenderSettingFeature", targets: ["GenderSettingFeature"]), - .library(name: "HowToMovieFeature", targets: ["HowToMovieFeature"]), - .library(name: "InvitationCodeFeature", targets: ["InvitationCodeFeature"]), - .library(name: "InvitationFeature", targets: ["InvitationFeature"]), - .library(name: "LaunchFeature", targets: ["LaunchFeature"]), - .library(name: "MaintenanceFeature", targets: ["MaintenanceFeature"]), - .library(name: "MatchedFeature", targets: ["MatchedFeature"]), - .library(name: "MatchEmptyFeature", targets: ["MatchEmptyFeature"]), - .library(name: "MembershipFeature", targets: ["MembershipFeature"]), - .library(name: "MembershipStatusFeature", targets: ["MembershipStatusFeature"]), - .library(name: "NavigationFeature", targets: ["NavigationFeature"]), - .library(name: "NetworkErrorFeature", targets: ["NetworkErrorFeature"]), - .library(name: "NotificationsReEnableFeature", targets: ["NotificationsReEnableFeature"]), - .library(name: "OnboardFeature", targets: ["OnboardFeature"]), - .library(name: "ProductPurchaseFeature", targets: ["ProductPurchaseFeature"]), - .library(name: "ProfileEditFeature", targets: ["ProfileEditFeature"]), - .library(name: "ProfileExplorerFeature", targets: ["ProfileExplorerFeature"]), - .library(name: "ProfileFeature", targets: ["ProfileFeature"]), - .library(name: "ProfilePictureSettingFeature", targets: ["ProfilePictureSettingFeature"]), - .library(name: "ProfileSharedFeature", targets: ["ProfileSharedFeature"]), - .library(name: "PushNotificationSettingsFeature", targets: ["PushNotificationSettingsFeature"]), - .library(name: "ReceivedLikeRouterFeature", targets: ["ReceivedLikeRouterFeature"]), - .library(name: "ReceivedLikeSwipeFeature", targets: ["ReceivedLikeSwipeFeature"]), - .library(name: "RecentMatchFeature", targets: ["RecentMatchFeature"]), - .library(name: "RecommendationFeature", targets: ["RecommendationFeature"]), - .library(name: "ReportFeature", targets: ["ReportFeature"]), - .library(name: "SettingsFeature", targets: ["SettingsFeature"]), - .library(name: "ShortCommentSettingFeature", targets: ["ShortCommentSettingFeature"]), - .library(name: "Styleguide", targets: ["Styleguide"]), - .library(name: "SwipeCardFeature", targets: ["SwipeCardFeature"]), - .library(name: "SwipeFeature", targets: ["SwipeFeature"]), - .library(name: "TutorialFeature", targets: ["TutorialFeature"]), - .library(name: "UsernameSettingFeature", targets: ["UsernameSettingFeature"]), - ], - dependencies: [ - .package(path: "../Utility"), - .package(path: "../MatchCore"), - .package(path: "../Dependencies"), - .package(url: "https://github.com/lorenzofiamingo/swiftui-cached-async-image", from: "2.1.1"), - ], - targets: [ - .target(name: "AchievementFeature", dependencies: [ - .product(name: "AchievementLogic", package: "MatchCore"), - .product(name: "FirebaseAuthClient", package: "Dependencies"), - ]), - .target(name: "AppFeature", dependencies: [ - "LaunchFeature", - "BannedFeature", - "OnboardFeature", - "FreezedFeature", - "NavigationFeature", - "ForceUpdateFeature", - "MaintenanceFeature", - "NetworkErrorFeature", - .product(name: "AsyncValue", package: "Utility"), - .product(name: "AppLogic", package: "MatchCore"), - .product(name: "AppsFlyerClient", package: "Dependencies"), - .product(name: "ScreenshotClient", package: "Dependencies"), - .product(name: "ConfigGlobalClient", package: "Dependencies"), - .product(name: "UserSettingsClient", package: "Dependencies"), - .product(name: "FirebaseCoreClient", package: "Dependencies"), - .product(name: "ApolloClientHelpers", package: "Utility"), - .product(name: "FirebaseMessagingClient", package: "Dependencies"), - .product(name: "ATTrackingManagerClient", package: "Dependencies"), - .product(name: "NotificationCenterClient", package: "Dependencies"), - .product(name: "FirebaseCrashlyticsClient", package: "Dependencies"), - ]), - .target(name: "BannedFeature", dependencies: [ - "Styleguide", - .product(name: "BannedLogic", package: "MatchCore"), - ]), - .target(name: "BannerFeature", dependencies: [ - "Styleguide", - .product(name: "BannerLogic", package: "MatchCore"), - ]), - .target(name: "DeleteAccountFeature", dependencies: [ - "Styleguide", - .product(name: "DeleteAccountLogic", package: "MatchCore"), - .product(name: "FirebaseAuthClient", package: "Dependencies"), - ]), - .target(name: "DirectMessageFeature", dependencies: [ - "ReportFeature", - .product(name: "DirectMessageLogic", package: "MatchCore"), - ]), - .target(name: "DirectMessageTabFeature", dependencies: [ - "BannerFeature", - "SettingsFeature", - "RecentMatchFeature", - "ReceivedLikeRouterFeature", - "NotificationsReEnableFeature", - .product(name: "DirectMessageTabLogic", package: "MatchCore"), - .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), - ]), - .target(name: "DisplayNameSettingFeature", dependencies: [ - "Styleguide", - .product(name: "DisplayNameSettingLogic", package: "MatchCore"), - ]), - .target(name: "ExplorerFeature", dependencies: [ - "Styleguide", - "SwipeFeature", - "MembershipFeature", - .product(name: "ExplorerLogic", package: "MatchCore"), - ]), - .target(name: "ForceUpdateFeature", dependencies: [ - "Styleguide", - .product(name: "ForceUpdateLogic", package: "MatchCore"), - ]), - .target(name: "FreezedFeature", dependencies: [ - "Styleguide", - .product(name: "FreezedLogic", package: "MatchCore"), - ]), - .target(name: "GenderSettingFeature", dependencies: [ - "Styleguide", - .product(name: "GenderSettingLogic", package: "MatchCore"), - ]), - .target(name: "HowToMovieFeature", dependencies: [ - "Styleguide", - .product(name: "UIApplicationClient", package: "Dependencies"), - .product(name: "HowToMovieLogic", package: "MatchCore"), - ]), - .target(name: "InvitationCodeFeature", dependencies: [ - "Styleguide", - .product(name: "InvitationCodeLogic", package: "MatchCore"), - ]), - .target(name: "InvitationFeature", dependencies: [ - "Styleguide", - .product(name: "InvitationLogic", package: "MatchCore"), - ]), - .target(name: "LaunchFeature", dependencies: [ - "Styleguide", - .product(name: "LaunchLogic", package: "MatchCore"), - ]), - .target(name: "MaintenanceFeature", dependencies: [ - "Styleguide", - .product(name: "MaintenanceLogic", package: "MatchCore"), - ]), - .target(name: "MatchedFeature", dependencies: [ - "Styleguide", - .product(name: "MatchedLogic", package: "MatchCore"), - ]), - .target(name: "MatchEmptyFeature", dependencies: [ - "Styleguide", - .product(name: "MatchEmptyLogic", package: "MatchCore"), - ]), - .target(name: "MembershipFeature", dependencies: [ - "Styleguide", - "ProductPurchaseFeature", - .product(name: "ColorHex", package: "Utility"), - .product(name: "Build", package: "Dependencies"), - .product(name: "TcaHelpers", package: "Utility"), - .product(name: "StoreKitHelpers", package: "Utility"), - .product(name: "MembershipLogic", package: "MatchCore"), - .product(name: "ActivityView", package: "Dependencies"), - .product(name: "StoreKitClient", package: "Dependencies"), - ]), - .target(name: "MembershipStatusFeature", dependencies: [ - "MembershipFeature", - .product(name: "MembershipStatusLogic", package: "MatchCore"), - ]), - .target(name: "NavigationFeature", dependencies: [ - "ExplorerFeature", - "RecommendationFeature", - "DirectMessageTabFeature", - .product(name: "NavigationLogic", package: "MatchCore"), - ]), - .target(name: "NetworkErrorFeature", dependencies: [ - .product(name: "NetworkErrorLogic", package: "MatchCore"), - ]), - .target(name: "NotificationsReEnableFeature", dependencies: [ - .product(name: "UIApplicationClient", package: "Dependencies"), - .product(name: "NotificationsReEnableLogic", package: "MatchCore"), - ]), - .target(name: "OnboardFeature", dependencies: [ - "InvitationFeature", - "HowToMovieFeature", - "GenderSettingFeature", - "UsernameSettingFeature", - "DisplayNameSettingFeature", - "ProfilePictureSettingFeature", - .product(name: "OnboardLogic", package: "MatchCore"), - .product(name: "PhotosClient", package: "Dependencies"), - .product(name: "UserDefaultsClient", package: "Dependencies"), - .product(name: "UIApplicationClient", package: "Dependencies"), - .product(name: "FirebaseAuthClient", package: "Dependencies"), - .product(name: "UserNotificationClient", package: "Dependencies"), - .product(name: "FirebaseStorageClient", package: "Dependencies"), - ]), - .target(name: "ProductPurchaseFeature", dependencies: [ - "Styleguide", - .product(name: "ProductPurchaseLogic", package: "MatchCore"), - ]), - .target(name: "ProfileEditFeature", dependencies: [ - "HowToMovieFeature", - "GenderSettingFeature", - "UsernameSettingFeature", - "DisplayNameSettingFeature", - "ShortCommentSettingFeature", - "ProfilePictureSettingFeature", - .product(name: "ProfileEditLogic", package: "MatchCore"), - ]), - .target(name: "ProfileExplorerFeature", dependencies: [ - "DirectMessageFeature", - "ProfileSharedFeature", - .product(name: "ProfileExplorerLogic", package: "MatchCore"), - ]), - .target(name: "ProfileFeature", dependencies: [ - "ProfileSharedFeature", - "UsernameSettingFeature", - .product(name: "ProfileLogic", package: "MatchCore"), - ]), - .target(name: "ProfilePictureSettingFeature", dependencies: [ - "Styleguide", - .product(name: "TcaHelpers", package: "Utility"), - .product(name: "FirebaseAuthClient", package: "Dependencies"), - .product(name: "FirebaseStorageClient", package: "Dependencies"), - .product(name: "ProfilePictureSettingLogic", package: "MatchCore"), - .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), - ]), - .target(name: "ProfileSharedFeature", dependencies: [ - "Styleguide", - "ReportFeature", - "DirectMessageFeature", - .product(name: "SelectControl", package: "MatchCore"), - .product(name: "ProfileSharedLogic", package: "MatchCore"), - .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), - ]), - .target(name: "PushNotificationSettingsFeature", dependencies: [ - .product(name: "PushNotificationSettingsLogic", package: "MatchCore"), - ]), - .target(name: "ReceivedLikeRouterFeature", dependencies: [ - "MembershipFeature", - "ReceivedLikeSwipeFeature", - .product(name: "ReceivedLikeRouterLogic", package: "MatchCore"), - ]), - .target(name: "ReceivedLikeSwipeFeature", dependencies: [ - "SwipeFeature", - .product(name: "ReceivedLikeSwipeLogic", package: "MatchCore"), - ]), - .target(name: "RecentMatchFeature", dependencies: [ - "ProfileExplorerFeature", - "ReceivedLikeRouterFeature", - .product(name: "RecentMatchLogic", package: "MatchCore"), - ]), - .target(name: "RecommendationFeature", dependencies: [ - "SwipeFeature", - "MatchedFeature", - .product(name: "ActivityView", package: "Dependencies"), - .product(name: "RecommendationLogic", package: "MatchCore"), - .product(name: "UIApplicationClient", package: "Dependencies"), - .product(name: "UserNotificationClient", package: "Dependencies"), - ]), - .target(name: "ReportFeature", dependencies: [ - "Styleguide", - .product(name: "ReportLogic", package: "MatchCore"), - ]), - .target(name: "SettingsFeature", dependencies: [ - "ProfileFeature", - "TutorialFeature", - "AchievementFeature", - "ProfileEditFeature", - "DeleteAccountFeature", - "MembershipStatusFeature", - "PushNotificationSettingsFeature", - .product(name: "Build", package: "Dependencies"), - .product(name: "SettingsLogic", package: "MatchCore"), - .product(name: "ActivityView", package: "Dependencies"), - .product(name: "FirebaseAuthClient", package: "Dependencies"), - ]), - .target(name: "ShortCommentSettingFeature", dependencies: [ - "Styleguide", - .product(name: "ShortCommentSettingLogic", package: "MatchCore"), - ]), - .target(name: "Styleguide"), - .target(name: "SwipeCardFeature", dependencies: [ - .product(name: "SelectControl", package: "MatchCore"), - .product(name: "SwipeCardLogic", package: "MatchCore"), - .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), - ]), - .target(name: "SwipeFeature", dependencies: [ - "ReportFeature", - "MatchedFeature", - "SwipeCardFeature", - .product(name: "TcaHelpers", package: "Utility"), - .product(name: "SwipeLogic", package: "MatchCore"), - ]), - .target(name: "TutorialFeature", dependencies: [ - "Styleguide", - .product(name: "TutorialLogic", package: "MatchCore"), - ]), - .target(name: "UsernameSettingFeature", dependencies: [ - "Styleguide", - .product(name: "UsernameSettingLogic", package: "MatchCore"), - ]), - ] -) + .library(name: "AchievementFeature", targets: ["AchievementFeature"]), + .library(name: "AppFeature", targets: ["AppFeature"]), + .library(name: "BannedFeature", targets: ["BannedFeature"]), + .library(name: "BannerFeature", targets: ["BannerFeature"]), + .library(name: "CategoryEmptyFeature", targets: ["CategoryEmptyFeature"]), + .library(name: "CategoryFeature", targets: ["CategoryFeature"]), + .library(name: "CategoryListFeature", targets: ["CategoryListFeature"]), + .library(name: "CategorySwipeFeature", targets: ["CategorySwipeFeature"]), + .library(name: "DeleteAccountFeature", targets: ["DeleteAccountFeature"]), + .library(name: "DirectMessageFeature", targets: ["DirectMessageFeature"]), + .library(name: "DirectMessageTabFeature", targets: ["DirectMessageTabFeature"]), + .library(name: "ForceUpdateFeature", targets: ["ForceUpdateFeature"]), + .library(name: "FreezedFeature", targets: ["FreezedFeature"]), + .library(name: "GenderSettingFeature", targets: ["GenderSettingFeature"]), + .library(name: "HowToMovieFeature", targets: ["HowToMovieFeature"]), + .library(name: "InvitationCodeFeature", targets: ["InvitationCodeFeature"]), + .library(name: "InvitationFeature", targets: ["InvitationFeature"]), + .library(name: "LaunchFeature", targets: ["LaunchFeature"]), + .library(name: "MaintenanceFeature", targets: ["MaintenanceFeature"]), + .library(name: "MatchedFeature", targets: ["MatchedFeature"]), + .library(name: "MatchEmptyFeature", targets: ["MatchEmptyFeature"]), + .library(name: "MembershipFeature", targets: ["MembershipFeature"]), + .library(name: "MembershipStatusFeature", targets: ["MembershipStatusFeature"]), + .library(name: "NavigationFeature", targets: ["NavigationFeature"]), + .library(name: "NetworkErrorFeature", targets: ["NetworkErrorFeature"]), + .library(name: "NotificationsReEnableFeature", targets: ["NotificationsReEnableFeature"]), + .library(name: "OnboardFeature", targets: ["OnboardFeature"]), + .library(name: "ProductPurchaseFeature", targets: ["ProductPurchaseFeature"]), + .library(name: "ProfileEditFeature", targets: ["ProfileEditFeature"]), + .library(name: "ProfileExplorerFeature", targets: ["ProfileExplorerFeature"]), + .library(name: "ProfileFeature", targets: ["ProfileFeature"]), + .library(name: "ProfilePictureSettingFeature", targets: ["ProfilePictureSettingFeature"]), + .library(name: "ProfileSharedFeature", targets: ["ProfileSharedFeature"]), + .library(name: "PushNotificationSettingsFeature", targets: ["PushNotificationSettingsFeature"]), + .library(name: "ReceivedLikeRouterFeature", targets: ["ReceivedLikeRouterFeature"]), + .library(name: "ReceivedLikeSwipeFeature", targets: ["ReceivedLikeSwipeFeature"]), + .library(name: "RecentMatchFeature", targets: ["RecentMatchFeature"]), + .library(name: "RecommendationFeature", targets: ["RecommendationFeature"]), + .library(name: "ReportFeature", targets: ["ReportFeature"]), + .library(name: "SettingsFeature", targets: ["SettingsFeature"]), + .library(name: "ShortCommentSettingFeature", targets: ["ShortCommentSettingFeature"]), + .library(name: "Styleguide", targets: ["Styleguide"]), + .library(name: "SwipeCardFeature", targets: ["SwipeCardFeature"]), + .library(name: "SwipeFeature", targets: ["SwipeFeature"]), + .library(name: "TutorialFeature", targets: ["TutorialFeature"]), + .library(name: "UsernameSettingFeature", targets: ["UsernameSettingFeature"]), + ], + dependencies: [ + .package(path: "../Utility"), + .package(path: "../MatchCore"), + .package(path: "../Dependencies"), + .package(url: "https://github.com/lorenzofiamingo/swiftui-cached-async-image", from: "2.1.1"), + ], + targets: [ + .target(name: "AchievementFeature", dependencies: [ + .product(name: "AchievementLogic", package: "MatchCore"), + .product(name: "FirebaseAuthClient", package: "Dependencies"), + ]), + .target(name: "AppFeature", dependencies: [ + "LaunchFeature", + "BannedFeature", + "OnboardFeature", + "FreezedFeature", + "NavigationFeature", + "ForceUpdateFeature", + "MaintenanceFeature", + "NetworkErrorFeature", + .product(name: "AsyncValue", package: "Utility"), + .product(name: "AppLogic", package: "MatchCore"), + .product(name: "AppsFlyerClient", package: "Dependencies"), + .product(name: "ScreenshotClient", package: "Dependencies"), + .product(name: "ConfigGlobalClient", package: "Dependencies"), + .product(name: "UserSettingsClient", package: "Dependencies"), + .product(name: "FirebaseCoreClient", package: "Dependencies"), + .product(name: "ApolloClientHelpers", package: "Utility"), + .product(name: "FirebaseMessagingClient", package: "Dependencies"), + .product(name: "ATTrackingManagerClient", package: "Dependencies"), + .product(name: "NotificationCenterClient", package: "Dependencies"), + .product(name: "FirebaseCrashlyticsClient", package: "Dependencies"), + ]), + .target(name: "BannedFeature", dependencies: [ + .product(name: "BannedLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "BannerFeature", dependencies: [ + .product(name: "BannerLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "CategoryEmptyFeature", dependencies: [ + .product(name: "CategoryEmptyLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "CategoryFeature", dependencies: [ + .product(name: "CategoryLogic", package: "MatchCore"), + "CategoryListFeature", + ]), + .target(name: "CategoryListFeature", dependencies: [ + .product(name: "CategoryListLogic", package: "MatchCore"), + "Styleguide", + "MembershipFeature", + "CategorySwipeFeature", + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "CategorySwipeFeature", dependencies: [ + .product(name: "CategorySwipeLogic", package: "MatchCore"), + "SwipeFeature", + "CategoryEmptyFeature", + ]), + .target(name: "DeleteAccountFeature", dependencies: [ + "Styleguide", + .product(name: "DeleteAccountLogic", package: "MatchCore"), + .product(name: "FirebaseAuthClient", package: "Dependencies"), + ]), + .target(name: "DirectMessageFeature", dependencies: [ + "ReportFeature", + .product(name: "DirectMessageLogic", package: "MatchCore"), + ]), + .target(name: "DirectMessageTabFeature", dependencies: [ + "BannerFeature", + "SettingsFeature", + "RecentMatchFeature", + "ReceivedLikeRouterFeature", + "NotificationsReEnableFeature", + .product(name: "DirectMessageTabLogic", package: "MatchCore"), + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "DisplayNameSettingFeature", dependencies: [ + .product(name: "DisplayNameSettingLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "ForceUpdateFeature", dependencies: [ + .product(name: "ForceUpdateLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "FreezedFeature", dependencies: [ + .product(name: "FreezedLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "GenderSettingFeature", dependencies: [ + .product(name: "GenderSettingLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "HowToMovieFeature", dependencies: [ + "Styleguide", + .product(name: "UIApplicationClient", package: "Dependencies"), + .product(name: "HowToMovieLogic", package: "MatchCore"), + ]), + .target(name: "InvitationCodeFeature", dependencies: [ + .product(name: "InvitationCodeLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "InvitationFeature", dependencies: [ + .product(name: "InvitationLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "LaunchFeature", dependencies: [ + "Styleguide", + .product(name: "LaunchLogic", package: "MatchCore"), + ]), + .target(name: "MaintenanceFeature", dependencies: [ + .product(name: "MaintenanceLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "MatchedFeature", dependencies: [ + "Styleguide", + .product(name: "MatchedLogic", package: "MatchCore"), + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "MatchEmptyFeature", dependencies: [ + .product(name: "MatchEmptyLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "MembershipFeature", dependencies: [ + "Styleguide", + "ProductPurchaseFeature", + .product(name: "ColorHex", package: "Utility"), + .product(name: "Build", package: "Dependencies"), + .product(name: "TcaHelpers", package: "Utility"), + .product(name: "MembershipLogic", package: "MatchCore"), + .product(name: "ActivityView", package: "Dependencies"), + .product(name: "StoreKitClient", package: "Dependencies"), + .product(name: "StoreKitHelpers", package: "Utility"), + ]), + .target(name: "MembershipStatusFeature", dependencies: [ + "MembershipFeature", + .product(name: "MembershipStatusLogic", package: "MatchCore"), + ]), + .target(name: "NavigationFeature", dependencies: [ + .product(name: "NavigationLogic", package: "MatchCore"), + "CategoryFeature", + "DirectMessageTabFeature", + "RecommendationFeature", + ]), + .target(name: "NetworkErrorFeature", dependencies: [ + .product(name: "NetworkErrorLogic", package: "MatchCore"), + .product(name: "AnalyticsClient", package: "Dependencies"), + ]), + .target(name: "NotificationsReEnableFeature", dependencies: [ + .product(name: "NotificationsReEnableLogic", package: "MatchCore"), + .product(name: "UIApplicationClient", package: "Dependencies"), + ]), + .target(name: "OnboardFeature", dependencies: [ + .product(name: "OnboardLogic", package: "MatchCore"), + "InvitationFeature", + "HowToMovieFeature", + "GenderSettingFeature", + "UsernameSettingFeature", + "ProfilePictureSettingFeature", + "DisplayNameSettingFeature", + .product(name: "PhotosClient", package: "Dependencies"), + .product(name: "UserDefaultsClient", package: "Dependencies"), + .product(name: "UIApplicationClient", package: "Dependencies"), + .product(name: "FirebaseAuthClient", package: "Dependencies"), + .product(name: "UserNotificationClient", package: "Dependencies"), + .product(name: "FirebaseStorageClient", package: "Dependencies"), + ]), + .target(name: "ProductPurchaseFeature", dependencies: [ + "Styleguide", + .product(name: "ProductPurchaseLogic", package: "MatchCore"), + ]), + .target(name: "ProfileEditFeature", dependencies: [ + .product(name: "ProfileEditLogic", package: "MatchCore"), + "HowToMovieFeature", + "GenderSettingFeature", + "UsernameSettingFeature", + "ShortCommentSettingFeature", + "ProfilePictureSettingFeature", + "DisplayNameSettingFeature", + ]), + .target(name: "ProfileExplorerFeature", dependencies: [ + .product(name: "ProfileExplorerLogic", package: "MatchCore"), + "DirectMessageFeature", + "ProfileSharedFeature", + ]), + .target(name: "ProfileFeature", dependencies: [ + .product(name: "ProfileLogic", package: "MatchCore"), + "ProfileSharedFeature", + "UsernameSettingFeature", + ]), + .target(name: "ProfilePictureSettingFeature", dependencies: [ + "Styleguide", + .product(name: "TcaHelpers", package: "Utility"), + .product(name: "FirebaseAuthClient", package: "Dependencies"), + .product(name: "FirebaseStorageClient", package: "Dependencies"), + .product(name: "ProfilePictureSettingLogic", package: "MatchCore"), + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "ProfileSharedFeature", dependencies: [ + "Styleguide", + "ReportFeature", + "DirectMessageFeature", + .product(name: "SelectControl", package: "MatchCore"), + .product(name: "ProfileSharedLogic", package: "MatchCore"), + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "PushNotificationSettingsFeature", dependencies: [ + .product(name: "PushNotificationSettingsLogic", package: "MatchCore"), + ]), + .target(name: "ReceivedLikeRouterFeature", dependencies: [ + "MembershipFeature", + "ReceivedLikeSwipeFeature", + .product(name: "ReceivedLikeRouterLogic", package: "MatchCore"), + ]), + .target(name: "ReceivedLikeSwipeFeature", dependencies: [ + "SwipeFeature", + .product(name: "ReceivedLikeSwipeLogic", package: "MatchCore"), + ]), + .target(name: "RecentMatchFeature", dependencies: [ + "ProfileExplorerFeature", + "ReceivedLikeRouterFeature", + .product(name: "RecentMatchLogic", package: "MatchCore"), + ]), + .target(name: "RecommendationFeature", dependencies: [ + "SwipeFeature", + "MatchedFeature", + .product(name: "ActivityView", package: "Dependencies"), + .product(name: "RecommendationLogic", package: "MatchCore"), + .product(name: "UIApplicationClient", package: "Dependencies"), + .product(name: "UserNotificationClient", package: "Dependencies"), + ]), + .target(name: "ReportFeature", dependencies: [ + "Styleguide", + .product(name: "ReportLogic", package: "MatchCore"), + ]), + .target(name: "SettingsFeature", dependencies: [ + "ProfileFeature", + "TutorialFeature", + "AchievementFeature", + "ProfileEditFeature", + "DeleteAccountFeature", + "MembershipStatusFeature", + "PushNotificationSettingsFeature", + .product(name: "Build", package: "Dependencies"), + .product(name: "SettingsLogic", package: "MatchCore"), + .product(name: "ActivityView", package: "Dependencies"), + .product(name: "FirebaseAuthClient", package: "Dependencies"), + ]), + .target(name: "ShortCommentSettingFeature", dependencies: [ + .product(name: "ShortCommentSettingLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "Styleguide"), + .target(name: "SwipeCardFeature", dependencies: [ + .product(name: "SelectControl", package: "MatchCore"), + .product(name: "SwipeCardLogic", package: "MatchCore"), + .product(name: "CachedAsyncImage", package: "swiftui-cached-async-image"), + ]), + .target(name: "SwipeFeature", dependencies: [ + .product(name: "SwipeLogic", package: "MatchCore"), + "Styleguide", + "ReportFeature", + "MatchedFeature", + "SwipeCardFeature", + .product(name: "TcaHelpers", package: "Utility"), + ]), + .target(name: "TutorialFeature", dependencies: [ + .product(name: "TutorialLogic", package: "MatchCore"), + "Styleguide", + ]), + .target(name: "UsernameSettingFeature", dependencies: [ + .product(name: "UsernameSettingLogic", package: "MatchCore"), + ]), + ] + ) diff --git a/Packages/PicMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift b/Packages/PicMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift index c32a2056..404a9faf 100644 --- a/Packages/PicMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift +++ b/Packages/PicMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift @@ -14,20 +14,20 @@ public struct AchievementHistoryWidgetView: View { VStack(alignment: .leading, spacing: 0) { Label("HISTORY", systemImage: "calendar") .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) HStack(alignment: .bottom, spacing: 8) { Text(viewStore.displayDaysAgo) - .font(.system(size: 64, weight: .semibold)) + .font(.system(size: 64, weight: .semibold, design: .rounded)) Text("days.", bundle: .module) - .font(.system(size: 32, weight: .semibold)) + .font(.system(size: 32, weight: .semibold, design: .rounded)) .padding(.bottom, 8) } Text(viewStore.displayCreationDate) .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, 16) diff --git a/Packages/PicMatch/Sources/AchievementFeature/AchievementRatingWidget.swift b/Packages/PicMatch/Sources/AchievementFeature/AchievementRatingWidget.swift index 732d375a..0f1c784e 100644 --- a/Packages/PicMatch/Sources/AchievementFeature/AchievementRatingWidget.swift +++ b/Packages/PicMatch/Sources/AchievementFeature/AchievementRatingWidget.swift @@ -5,7 +5,7 @@ struct AchievementRatingWidgetView: View { VStack(alignment: .leading, spacing: 8) { Text("RATING", bundle: .module) .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) HStack(spacing: 8) { ForEach(0 ..< 5) { _ in @@ -24,7 +24,7 @@ struct AchievementRatingWidgetView: View { Text("Count of swipes across Japan", bundle: .module) .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, 16) diff --git a/Packages/PicMatch/Sources/AchievementFeature/AchievementWidget.swift b/Packages/PicMatch/Sources/AchievementFeature/AchievementWidget.swift index 051dcc23..93a37b5e 100644 --- a/Packages/PicMatch/Sources/AchievementFeature/AchievementWidget.swift +++ b/Packages/PicMatch/Sources/AchievementFeature/AchievementWidget.swift @@ -10,14 +10,14 @@ struct AchievementWidgetView: View { VStack(alignment: .leading, spacing: 0) { Label(titleKey, systemImage: systemImage) .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) Text(displayCount) - .font(.system(size: 64, weight: .semibold)) + .font(.system(size: 64, weight: .semibold, design: .rounded)) Text(text) .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, 16) diff --git a/Packages/PicMatch/Sources/AchievementFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/AchievementFeature/Localizable.xcstrings index 2860a351..66c5b1a2 100644 --- a/Packages/PicMatch/Sources/AchievementFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/AchievementFeature/Localizable.xcstrings @@ -2,116 +2,346 @@ "sourceLanguage" : "en", "strings" : { "0.1%" : { - + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "0.1%" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "0,1%" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "0,1%" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "0,1%" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "0,1%" + } + } + } }, "Achievement" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アチーブメント" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업적" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Réussite" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "アチーブメント" + "value" : "Osiągnięcie" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thành tựu" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Logro" } } } }, "Count of match" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マッチした数" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "매치 수" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Nombre de correspondances" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "マッチした数" + "value" : "Liczba dopasowań" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Số lần ghép đôi" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantidad de coincidencias" } } } }, "Count of swipes" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スワイプした数" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스와이프 수" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Nombre de balayages" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "スワイプした数" + "value" : "Liczba przesunięć" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Số lần vuốt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantidad de deslizamientos" } } } }, "Count of swipes across Japan" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "日本全体でのスワイプ数" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "일본 전역의 스와이프 수" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Nombre de balayages au Japon" + "value" : "Nombre de balayages à travers le Japon" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "日本全体でのスワイプ数" + "value" : "Liczba przesunięć w całej Japonii" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Số lần vuốt trên khắp Nhật Bản" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantidad de deslizamientos en todo Japón" } } } }, "Count of visitor" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プロフィールを見られた数" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "방문자 수" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Nombre de visiteurs" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "プロフィールを見られた数" + "value" : "Liczba odwiedzających" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Số lượng khách truy cập" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cantidad de visitantes" } } } }, "days." : { - + "localizations" : { + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "일." + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "jours." + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "dni." + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "ngày." + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "días." + } + } + } }, "HISTORY" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "HISTORY" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "HISTORY" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "HISTORIQUE" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "HISTORY" + "value" : "HISTORIA" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "LỊCH SỬ" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "HISTORIA" } } } }, "MATCH" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "MATCH" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "MATCH" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "CORRESPONDANCE" + "value" : "MATCH" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "MATCH" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "MATCH" + } + }, + "es" : { "stringUnit" : { "state" : "translated", "value" : "MATCH" @@ -121,29 +351,77 @@ }, "RATING" : { "localizations" : { - "fr" : { + "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ÉVALUATION" + "value" : "RATING" } }, - "ja" : { + "ko" : { "stringUnit" : { "state" : "translated", "value" : "RATING" } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "NOTE" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "OCENA" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ĐÁNH GIÁ" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "VALORACIÓN" + } } } }, "SWIPE" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "SWIPE" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "SWIPE" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "BALAYAGE" + "value" : "SWIPE" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "SWIPE" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "SWIPE" + } + }, + "es" : { "stringUnit" : { "state" : "translated", "value" : "SWIPE" @@ -153,13 +431,37 @@ }, "Top" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Top" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Top" + } + }, + "es" : { "stringUnit" : { "state" : "translated", "value" : "Top" @@ -169,20 +471,44 @@ }, "VISITOR" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "VISITOR" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "VISITOR" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "VISITEUR" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "VISITOR" + "value" : "ODWIEDZAJĄCY" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "KHÁCH THĂM QUAN" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "VISITANTE" } } } } }, "version" : "1.0" -} \ No newline at end of file +} diff --git a/Packages/PicMatch/Sources/BannedFeature/Banned.swift b/Packages/PicMatch/Sources/BannedFeature/Banned.swift index 4dc4048b..217251b5 100644 --- a/Packages/PicMatch/Sources/BannedFeature/Banned.swift +++ b/Packages/PicMatch/Sources/BannedFeature/Banned.swift @@ -14,25 +14,25 @@ public struct BannedView: View { VStack(spacing: 24) { Spacer() - Text("Your account has been banned from BeMatch.", bundle: .module) - .font(.system(.headline, weight: .semibold)) + Text("Your account has been banned from TenMatch.", bundle: .module) + .font(.system(.headline, design: .rounded, weight: .semibold)) - Text("It's important to us that BeMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.bematch.jp/terms-of-use) and so we've made the decision to remove you from the BeMatch Platform.", bundle: .module) - .font(.system(.body, weight: .semibold)) + Text("It's important to us that TenMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.tenmatch.app/terms-of-use) and so we've made the decision to remove you from the TenMatch Platform.", bundle: .module) + .font(.system(.body, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) - Text("You will no longer be able to access your BeMatch account or create new accounts in the future.", bundle: .module) - .font(.system(.body, weight: .semibold)) + Text("You will no longer be able to access your TenMatch account or create new accounts in the future.", bundle: .module) + .font(.system(.body, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) Text("id: \(viewStore.userId)") - .font(.system(.body, weight: .semibold)) + .font(.system(.body, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) Spacer() Text("Please note that if you are subscribed to any premium services through the App Store, you will need to cancel your subscription with the appropriate provider.", bundle: .module) - .font(.system(.caption, weight: .semibold)) + .font(.system(.caption, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) } .padding(.horizontal, 16) diff --git a/Packages/PicMatch/Sources/BannedFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/BannedFeature/Localizable.xcstrings index 25c36db8..3ee33b50 100644 --- a/Packages/PicMatch/Sources/BannedFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/BannedFeature/Localizable.xcstrings @@ -1,147 +1,206 @@ { - "sourceLanguage": "en", - "strings": { - "id: %@": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "id: %@" + "sourceLanguage" : "en", + "strings" : { + "id: %@" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "id : %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "id: %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "id: %@" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "id: %@" } } } }, - "It's important to us that BeMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.bematch.jp/terms-of-use) and so we've made the decision to remove you from the BeMatch Platform.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "BeMatchでは、すべての人にとって安心で安全な場所であることを重視しています。残念ながらあなたの行為が[利用規約](https://docs.bematch.jp/terms-of-use)に違反したことが判明したため、当社はあなたをBeMatchのプラットフォームから削除することを決定しました。" + "It's important to us that TenMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.tenmatch.app/terms-of-use) and so we've made the decision to remove you from the TenMatch Platform." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatchでは、すべての人にとって安心で安全な場所であることを重視しています。残念ながらあなたの行為が[利用規約](https://docs.tenmatch.app/terms-of-use)に違反したことが判明したため、当社はあなたをTenMatchのプラットフォームから削除することを決定しました。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch은 모든 사람에게 환영받고 안전한 공간이 되는 것이 중요합니다. 안타깝게도 귀하가 당사의 [이용 약관](https://docs.tenmatch.app/terms-of-use)을 위반한 사실이 발견되어 귀하를 TenMatch 플랫폼에서 삭제하기로 결정했습니다." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Il est important pour nous que TenMatch soit un espace accueillant et sûr pour tout le monde. Malheureusement, nous avons constaté que vous avez violé nos [Conditions d'utilisation](https://docs.tenmatch.app/terms-of-use) et avons donc pris la décision de vous retirer de la plateforme TenMatch." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Il est important pour nous que BeMatch soit un espace accueillant et sûr pour tout le monde. Malheureusement, nous avons constaté que vous avez violé nos [Conditions d'utilisation](https://docs.bematch.jp/terms-of-use) et avons donc décidé de vous retirer de la plateforme BeMatch." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dla nas ważne jest, aby TenMatch było przyjaznym i bezpiecznym miejscem dla każdego. Niestety stwierdziliśmy, że naruszyłeś nasze [Warunki użytkowania](https://docs.tenmatch.app/terms-of-use), dlatego podjęliśmy decyzję o usunięciu Cię z platformy TenMatch." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Điều quan trọng đối với chúng tôi là BeMatch là một không gian chào đón và an toàn cho mọi người. Thật không may, chúng tôi phát hiện rằng bạn đã vi phạm [Điều khoản Sử dụng](https://docs.bematch.jp/terms-of-use) và do đó, chúng tôi đã quyết định xóa bạn khỏi Nền tảng BeMatch." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Điều quan trọng đối với chúng tôi là TenMatch là một không gian chào đón và an toàn cho mọi người. Thật không may, chúng tôi nhận thấy rằng bạn đã vi phạm [Điều khoản Sử dụng](https://docs.tenmatch.app/terms-of-use) của chúng tôi và do đó, chúng tôi đã quyết định xóa bạn khỏi Nền tảng TenMatch." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "BeMatch는 모든 사람에게 환영받고 안전한 공간이 되는 것이 중요합니다. 불행히도 귀하가 [이용 약관](https://docs.bematch.jp/terms-of-use)을 위반한 것으로 확인되어 BeMatch 플랫폼에서 귀하를 삭제하기로 결정했습니다." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Es importante para nosotros que TenMatch sea un espacio acogedor y seguro para todos. Desafortunadamente, encontramos que has violado nuestros [Términos de uso](https://docs.tenmatch.app/terms-of-use) y por lo tanto hemos tomado la decisión de eliminarte de la plataforma TenMatch." } } } }, - "Please note that if you are subscribed to any premium services through the App Store, you will need to cancel your subscription with the appropriate provider.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "App Storeを通じて購読している場合は、App Storeで解約する必要がありますのでご注意ください。" + "Please note that if you are subscribed to any premium services through the App Store, you will need to cancel your subscription with the appropriate provider." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Storeを通じて購読している場合は、App Storeで解約する必要がありますのでご注意ください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Store를 통해 프리미엄 서비스를 구독한 경우 해당 제공업체를 통해 구독을 취소해야 합니다." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Veuillez noter que si vous êtes abonné à des services premium via l'App Store, vous devrez annuler votre abonnement auprès du fournisseur approprié." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veuillez noter que si vous êtes abonné à des services premium via l'App Store, vous devrez annuler votre abonnement auprès du fournisseur approprié." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Xin lưu ý rằng nếu bạn đã đăng ký bất kỳ dịch vụ cao cấp nào qua App Store, bạn sẽ cần hủy đăng ký của mình với nhà cung cấp tương ứng." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Należy pamiętać, że jeśli subskrybujesz jakiekolwiek usługi premium przez App Store, musisz anulować subskrypcję u odpowiedniego dostawcy." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "App Store를 통해 프리미엄 서비스에 가입한 경우 해당 제공업체에서 구독을 취소해야 합니다." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vui lòng lưu ý rằng nếu bạn đã đăng ký bất kỳ dịch vụ cao cấp nào thông qua App Store, bạn sẽ cần hủy đăng ký của mình với nhà cung cấp phù hợp." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ten en cuenta que si estás suscrito a cualquier servicio premium a través de la App Store, deberás cancelar tu suscripción con el proveedor correspondiente." } } } }, - "You will no longer be able to access your BeMatch account or create new accounts in the future.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "あなたは今後、BeMatchのアカウントにアクセスしたり、新しいアカウントを作成することは出来ません。" + "You will no longer be able to access your TenMatch account or create new accounts in the future." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "あなたは今後、TenMatchのアカウントにアクセスしたり、新しいアカウントを作成することは出来ません。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "더 이상 TenMatch 계정에 액세스하거나 새 계정을 만들 수 없습니다." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous ne pourrez plus accéder à votre compte TenMatch ni créer de nouveaux comptes à l'avenir." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Vous ne pourrez plus accéder à votre compte BeMatch ou créer de nouveaux comptes à l'avenir." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie będziesz już mieć dostępu do swojego konta TenMatch ani tworzyć nowych kont w przyszłości." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Bạn sẽ không thể truy cập vào tài khoản BeMatch của mình hoặc tạo tài khoản mới trong tương lai." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn sẽ không thể truy cập tài khoản TenMatch của mình hoặc tạo tài khoản mới trong tương lai." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "더 이상 BeMatch 계정에 액세스하거나 새 계정을 만들 수 없습니다." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ya no podrás acceder a tu cuenta de TenMatch ni crear nuevas cuentas en el futuro." } } } }, - "Your account has been banned from BeMatch.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "あなたのBeMatchアカウントは利用停止されました。" + "Your account has been banned from TenMatch." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "あなたのTenMatchアカウントは利用停止されました。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "귀하의 TenMatch 계정이 정지되었습니다." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Votre compte a été banni de TenMatch." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Votre compte a été banni de BeMatch." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Twoje konto zostało zbanowane na TenMatch." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Tài khoản của bạn đã bị cấm sử dụng BeMatch." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tài khoản của bạn đã bị cấm khỏi TenMatch." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "귀하의 BeMatch 계정이 정지되었습니다." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tu cuenta ha sido prohibida en TenMatch." } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/BannerFeature/Banner.swift b/Packages/PicMatch/Sources/BannerFeature/Banner.swift index f964e6f8..4566bc58 100644 --- a/Packages/PicMatch/Sources/BannerFeature/Banner.swift +++ b/Packages/PicMatch/Sources/BannerFeature/Banner.swift @@ -15,7 +15,7 @@ public struct BannerView: View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 8) { Text(viewStore.banner.title) - .font(.system(.footnote, weight: .semibold)) + .font(.system(.footnote, design: .rounded, weight: .semibold)) if let description = viewStore.banner.description { Text(description) @@ -26,7 +26,7 @@ public struct BannerView: View { store.send(.bannerButtonTapped) } label: { Text(viewStore.banner.buttonTitle) - .font(.system(.caption2, weight: .semibold)) + .font(.system(.caption2, design: .rounded, weight: .semibold)) .foregroundStyle(Color.black) .frame(height: 38) .frame(maxWidth: .infinity) @@ -51,10 +51,10 @@ public struct BannerView: View { _dataDict: DataDict( data: [ "id": "id", - "title": "BeMatch.の社長と話そう", + "title": "TenMatchの社長と話そう", "description": "アプリの改善策や不具合などあれば教えてください。", "buttonTitle": "開く", - "url": "https://bematch.jp", + "url": "https://tenmatch.app", "startAt": 10, "endAt": 10, ], diff --git a/Packages/PicMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift b/Packages/PicMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift index 0a252928..f2795c36 100644 --- a/Packages/PicMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift +++ b/Packages/PicMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift @@ -19,7 +19,7 @@ public struct CategoryEmptyView: View { .frame(width: 120) Text("Looks like he's gone.", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) PrimaryButton( String(localized: "Swipe others", bundle: .module) diff --git a/Packages/PicMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings index 386c9e6b..c654cfcd 100644 --- a/Packages/PicMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings @@ -1,63 +1,86 @@ { - "sourceLanguage": "en", - "strings": { - "Looks like he's gone.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "もういないみたい..." + "sourceLanguage" : "en", + "strings" : { + "Looks like he's gone." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "もういないみたい..." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "On dirait qu'il est parti." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "그는 사라진 것 같아..." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Có vẻ như anh ấy đã đi rồi." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "On dirait qu'il est parti..." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "그가 떠난 것 같아요." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wygląda na to, że go nie ma..." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Có vẻ như anh ấy đã đi rồi..." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Parece que se ha ido..." } } } }, - "Swipe others": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "他の人をスワイプする" + "Swipe others" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "他の人をスワイプする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다른 사람들을 스와이프" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Swiper d'autres personnes" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Balayer d'autres" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przesuń innych" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Vuốt những người khác" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuốt người khác" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다른 사람들 스와이프" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desliza a otros" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/CategoryListFeature/CategoryList.swift b/Packages/PicMatch/Sources/CategoryListFeature/CategoryList.swift index 0c1863da..ddf26dc1 100644 --- a/Packages/PicMatch/Sources/CategoryListFeature/CategoryList.swift +++ b/Packages/PicMatch/Sources/CategoryListFeature/CategoryList.swift @@ -13,7 +13,7 @@ public struct CategoryListView: View { public var body: some View { ScrollView(.vertical) { - VStack(spacing: 24) { + LazyVStack(spacing: 16) { ForEachStore( store.scope(state: \.rows, action: \.rows), content: CategorySectionView.init(store:) diff --git a/Packages/PicMatch/Sources/CategoryListFeature/CategoryRow.swift b/Packages/PicMatch/Sources/CategoryListFeature/CategoryRow.swift index bbb68e7b..37a5c559 100644 --- a/Packages/PicMatch/Sources/CategoryListFeature/CategoryRow.swift +++ b/Packages/PicMatch/Sources/CategoryListFeature/CategoryRow.swift @@ -36,10 +36,10 @@ public struct CategoryRowView: View { image .resizable() .aspectRatio(contentMode: .fill) - .frame(width: 150, height: 200) + .frame(width: 144, height: 192) } placeholder: { Color.black - .frame(width: 150, height: 200) + .frame(width: 144, height: 192) .overlay { ProgressView() .tint(Color.white) @@ -47,20 +47,6 @@ public struct CategoryRowView: View { } .blur(radius: viewStore.isBlur ? 18 : 0) .clipShape(RoundedRectangle(cornerRadius: 8)) - .overlay(alignment: .bottom) { - if !viewStore.isBlur { - LinearGradient( - colors: [ - Color.black.opacity(0.0), - Color.black.opacity(1.0), - ], - startPoint: .top, - endPoint: .bottom - ) - .frame(height: 100) - .clipShape(RoundedRectangle(cornerRadius: 8)) - } - } .overlay { if viewStore.isBlur { RoundedRectangle(cornerRadius: 8) diff --git a/Packages/PicMatch/Sources/CategoryListFeature/CategorySection.swift b/Packages/PicMatch/Sources/CategoryListFeature/CategorySection.swift index 7c4d81d1..abc6c5c6 100644 --- a/Packages/PicMatch/Sources/CategoryListFeature/CategorySection.swift +++ b/Packages/PicMatch/Sources/CategoryListFeature/CategorySection.swift @@ -13,11 +13,12 @@ public struct CategorySectionView: View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(alignment: .leading, spacing: 8) { Text(viewStore.userCategory.title) - .font(.system(.callout, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) + .foregroundStyle(Color.secondary) .padding(.horizontal, 16) ScrollView(.horizontal, showsIndicators: false) { - LazyHStack(spacing: 12) { + LazyHStack(spacing: 8) { ForEachStore( store.scope(state: \.rows, action: \.rows), content: CategoryRowView.init(store:) diff --git a/Packages/PicMatch/Sources/DeleteAccountFeature/DeleteAccount.swift b/Packages/PicMatch/Sources/DeleteAccountFeature/DeleteAccount.swift index a039d104..3fb04bfb 100644 --- a/Packages/PicMatch/Sources/DeleteAccountFeature/DeleteAccount.swift +++ b/Packages/PicMatch/Sources/DeleteAccountFeature/DeleteAccount.swift @@ -14,7 +14,7 @@ public struct DeleteAccountView: View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 8) { Text("Are you sure you want to delete your account?", bundle: .module) - .font(.system(.body, weight: .semibold)) + .font(.system(.body, design: .rounded, weight: .semibold)) Text("This **cannot** be undone or recovered.", bundle: .module) @@ -30,7 +30,7 @@ public struct DeleteAccountView: View { } label: { Text(reason) .foregroundStyle(Color.white) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) } .frame(height: 50) } @@ -65,7 +65,7 @@ public struct DeleteAccountView: View { Text("Not Now", bundle: .module) .frame(height: 50) .foregroundStyle(Color.white) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) } } .multilineTextAlignment(.center) @@ -74,7 +74,7 @@ public struct DeleteAccountView: View { .toolbar { ToolbarItem(placement: .principal) { Text("Delete Account", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) } ToolbarItem(placement: .topBarLeading) { Button { diff --git a/Packages/PicMatch/Sources/DeleteAccountFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/DeleteAccountFeature/Localizable.xcstrings index 61cd3269..f38b9b0e 100644 --- a/Packages/PicMatch/Sources/DeleteAccountFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/DeleteAccountFeature/Localizable.xcstrings @@ -1,175 +1,246 @@ { - "sourceLanguage": "en", - "strings": { - "Are you sure you want to delete your account?": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "本当にアカウントを削除しますか?" + "sourceLanguage" : "en", + "strings" : { + "Are you sure you want to delete your account?" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "本当にアカウントを削除しますか?" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Êtes-vous sûr de vouloir supprimer votre compte ?" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "정말로 계정을 삭제하시겠습니까?" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Bạn có chắc chắn muốn xóa tài khoản của mình không?" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Êtes-vous sûr de vouloir supprimer votre compte ?" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "정말 계정을 삭제하시겠습니까?" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Czy na pewno chcesz usunąć swoje konto?" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn có chắc chắn muốn xóa tài khoản của mình không?" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¿Estás seguro de que deseas eliminar tu cuenta?" } } } }, - "Delete Account": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "アカウント削除" + "Delete Account" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アカウント削除" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계정 삭제" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Supprimer le compte" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Supprimer le compte" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Xóa tài khoản" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Usuń konto" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "계정 삭제" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xóa tài khoản" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eliminar cuenta" } } } }, - "Not Now": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "今はしない" + "Not Now" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "今はしない" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "지금은 아니오" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pas maintenant" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Pas maintenant" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie teraz" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Không phải bây giờ" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Không phải bây giờ" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "지금은 안함" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No ahora" } } } }, - "Other Reason": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "その他の理由" + "Other Reason" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "その他の理由" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Autre raison" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다른 이유" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Lý do khác" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autre raison" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "기타 이유" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inny powód" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lý do khác" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otra razón" } } } }, - "Proceed with Deletion": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "削除する" + "Proceed with Deletion" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "削除する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "삭제 진행" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Procéder à la suppression" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Procéder à la suppression" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Tiến hành xóa" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przejdź do usunięcia" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "삭제 진행" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiến hành xóa" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proceder con la eliminación" } } } }, - "This **cannot** be undone or recovered.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "これを元に戻したり、回復したりすることは**出来ません**。" + "This **cannot** be undone or recovered." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "これを元に戻したり、回復したりすることは**出来ません**。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "이것은 **되돌릴 수** 없거나 복구할 수 없습니다." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cela **ne peut pas** être annulé ou récupéré." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Cela **ne peut pas** être annulé ou récupéré." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tego **nie można** cofnąć ani odzyskać." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Điều này **không thể** hoàn tác hoặc khôi phục." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Điều này **không thể** được hoàn tác hoặc khôi phục." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "이 작업은 **취소**하거나 복구할 수 없습니다." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Esto **no** se puede deshacer ni recuperar." } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift b/Packages/PicMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift index 8ec1d732..6a9858a8 100644 --- a/Packages/PicMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift +++ b/Packages/PicMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift @@ -18,16 +18,22 @@ public struct DirectMessageEmptyView: View { VStack(spacing: 8) { Text("Matched with \(viewStore.displayName)!", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) - Text("Add BeReal and send a message!", bundle: .module) + Text("Add tenten and send a message!", bundle: .module) } .multilineTextAlignment(.center) - PrimaryButton( - String(localized: "Add BeReal", bundle: .module) - ) { - store.send(.jumpExternalProductButtonTapped) + VStack(spacing: 12) { + PrimaryButton( + String(localized: "Copy tenten’s PIN", bundle: .module) + ) { + store.send(.jumpExternalProductButtonTapped) + } + + Text("🧷 \(viewStore.tentenPinCode)", bundle: .module) + .foregroundStyle(Color.white) + .font(.system(.caption, design: .rounded, weight: .semibold)) } } .frame(maxHeight: .infinity) @@ -41,3 +47,19 @@ public struct DirectMessageEmptyView: View { } } } + +#Preview { + NavigationStack { + DirectMessageEmptyView( + store: .init( + initialState: DirectMessageEmptyLogic.State( + displayName: "tomokisun", + externalProductUrl: "https://bere.al/tomokisun", + tentenPinCode: "du9v5pq" + ), + reducer: { DirectMessageEmptyLogic() } + ) + ) + } + .environment(\.colorScheme, .dark) +} diff --git a/Packages/PicMatch/Sources/DirectMessageFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/DirectMessageFeature/Localizable.xcstrings index 9c706081..290c9f2b 100644 --- a/Packages/PicMatch/Sources/DirectMessageFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/DirectMessageFeature/Localizable.xcstrings @@ -1,146 +1,246 @@ { - "sourceLanguage": "en", - "strings": { - "Add BeReal": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "BeRealを追加する" + "sourceLanguage" : "en", + "strings" : { + "🧷 %@" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Ajouter BeReal" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thêm BeReal" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "BeReal 추가" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + } + } + }, + "Add tenten and send a message!" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Agrega tenten y envía un mensaje!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajoutez un tenten et envoyez un message !" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenを追加してメッセージを送ってみよう!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로켓을 추가하고 메시지를 보내세요!" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj tenten i wyślij wiadomość!" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm tenten và gửi tin nhắn!" } } } }, - "Add BeReal and send a message!": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "BeRealを追加してメッセージを送ってみよう!" + "Copy tenten’s PIN" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar el PIN de tenten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copier le PIN de tenten" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenのPINをコピー" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Ajoutez BeReal et envoyez un message !" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "tenten의 PIN 복사" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thêm BeReal và gửi tin nhắn!" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skopiuj PIN tenten" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "BeReal을 추가하고 메시지 보내기!" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sao chép PIN của tenten" } } } }, - "Matched with %@!": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "%@さんとマッチしたよ!" + "Matched with %@!" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Emparejado con %@!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Correspondance avec %@ !" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@さんとマッチしたよ!" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Correspondance avec %@ !" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@님과 매치되었습니다!" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Đã ghép đôi với %@!" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopasowany z %@!" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "%@와 매치되었습니다!" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kết hợp với %@!" } } } }, - "Report": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "通報" + "Report" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Informar" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Signaler" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Signaler" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Báo cáo" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通報" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "신고" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "신고" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zgłoś" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Báo cáo" } } } }, - "The operator may check and delete the contents of messages for the purpose of operating a sound service. In addition, the account may be suspended if inappropriate use is confirmed.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "健全なサービスを運営する目的で運営者がメッセージの内容を確認・削除する場合があります。また、不適切な利用を確認するとアカウントを停止する場合があります。" + "The operator may check and delete the contents of messages for the purpose of operating a sound service. In addition, the account may be suspended if inappropriate use is confirmed." : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "El operador puede verificar y eliminar el contenido de los mensajes con el propósito de operar un servicio saludable. Además, la cuenta puede ser suspendida si se confirma el uso inapropiado." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "L'opérateur peut vérifier et supprimer le contenu des messages dans le but de fournir un service sain. De plus, le compte peut être suspendu si une utilisation inappropriée est confirmée." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "健全なサービスを運営する目的で運営者がメッセージの内容を確認・削除する場合があります。また、不適切な利用を確認するとアカウントを停止する場合があります。" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "L'opérateur peut vérifier et supprimer le contenu des messages afin de maintenir un service sain. De plus, le compte peut être suspendu en cas d'utilisation inappropriée." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "운영자는 건전한 서비스를 운영하기 위해 메시지 내용을 확인하고 삭제할 수 있습니다. 또한 부적절한 사용이 확인되면 계정이 정지될 수 있습니다." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Người điều hành có thể kiểm tra và xóa nội dung tin nhắn nhằm duy trì dịch vụ lành mạnh. Ngoài ra, tài khoản có thể bị đình chỉ nếu xác nhận việc sử dụng không phù hợp." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Operator może sprawdzać i usuwać treści wiadomości w celu zapewnienia prawidłowego działania usługi. Ponadto konto może zostać zawieszone w przypadku potwierdzenia nieodpowiedniego użytkowania." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "운영자는 건전한 서비스를 위해 메시지 내용을 확인 및 삭제할 수 있습니다. 또한 부적절한 사용이 확인되면 계정이 정지될 수 있습니다." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nhà điều hành có thể kiểm tra và xóa nội dung tin nhắn để cung cấp dịch vụ tốt. Ngoài ra, tài khoản có thể bị đình chỉ nếu phát hiện sử dụng không đúng mục đích." } } } } }, - "version": "1.0" -} + "version" : "1.0" +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift index f3f497ac..74f651d8 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift @@ -11,8 +11,9 @@ public struct DirectMessageListView: View { public var body: some View { LazyVStack(alignment: .leading, spacing: 8) { - Text("MESSAGE", bundle: .module) - .font(.system(.callout, weight: .semibold)) + Text("Messages", bundle: .module) + .foregroundStyle(Color.secondary) + .font(.system(.callout, design: .rounded, weight: .semibold)) SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in switch initialState { diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift index 8591bf9d..9dc28f2a 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift @@ -47,11 +47,11 @@ public struct DirectMessageListContentRowView: View { VStack(alignment: .leading, spacing: 6) { HStack(spacing: 0) { Text(viewStore.displayName) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(maxWidth: .infinity, alignment: .leading) if !viewStore.isAuthor { - Text("Let's Reply", bundle: .module) + Text("Reply!", bundle: .module) .font(.system(.caption2, weight: .medium)) .foregroundStyle(Color.black) .padding(.vertical, 3) diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings index bec468a8..753d1189 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings @@ -1,147 +1,206 @@ { - "sourceLanguage": "en", - "strings": { - "Let's Reply": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "返信しよう" + "sourceLanguage" : "en", + "strings" : { + "Likes" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Likes" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Répondons" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "좋아요" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Hãy trả lời" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "J'aime" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "답장하자" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Polubienia" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thích" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Me gusta" } } } }, - "Like": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "Like" + "Messages" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Messages" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "J'aime" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wiadomości" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thích" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tin nhắn" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "좋아요" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensajes" } } } }, - "MESSAGE": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "メッセージ" + "Recently Match" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最近のマッチ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "최근 매치" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "MESSAGE" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Match récent" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "TIN NHẮN" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niedawno dopasowane" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메시지" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kết hợp gần đây" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Coincidencia reciente" } } } }, - "RECENT MATCH": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "最近のマッチ" + "Reply!" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "返信しよう" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "답장!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Répondre !" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "CORRESPONDANCE RÉCENTE" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odpowiedz!" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "GHÉP ĐÔI GẦN ĐÂY" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trả lời!" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "최근 매치" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Responder!" } } } }, - "SEE MORE": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "すべて見る" + "See More" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "すべて見る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "더 보기" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voir plus" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Voir plus" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zobacz więcej" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Xem thêm" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xem thêm" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "더 보기" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ver más" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift index ec3cb72d..328a53c2 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift @@ -13,16 +13,18 @@ public struct UnsentDirectMessageListView: View { public var body: some View { VStack(alignment: .leading, spacing: 8) { HStack(spacing: 0) { - Text("RECENT MATCH", bundle: .module) - .font(.system(.callout, weight: .semibold)) + Text("Recently Match", bundle: .module) + .foregroundStyle(Color.secondary) + .font(.system(.callout, design: .rounded, weight: .semibold)) .frame(maxWidth: .infinity, alignment: .leading) Button { store.send(.seeAllButtonTapped) } label: { HStack(spacing: 4) { - Text("SEE MORE", bundle: .module) + Text("See More", bundle: .module) .font(.caption) + .foregroundStyle(Color.secondary) Image(systemName: "chevron.right") } diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift index 9d2539c8..e35cc1a3 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift @@ -26,7 +26,7 @@ public struct UnsentDirectMessageListContentView: View { if viewStore.hasNextPage { ProgressView() .tint(Color.white) - .frame(width: 90, height: 120) + .frame(width: 96, height: 96) .task { await store.send(.scrollViewBottomReached).finish() } } } diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift index bef0a44b..b325caf8 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift @@ -15,11 +15,11 @@ public struct UnsentDirectMessageListContentReceivedLikeRowView: View { var goldGradient: LinearGradient { LinearGradient( colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), + Color(0xFF9F0A), + Color(0xFFD60A), ], - startPoint: .leading, - endPoint: .trailing + startPoint: .top, + endPoint: .bottom ) } @@ -36,12 +36,12 @@ public struct UnsentDirectMessageListContentReceivedLikeRowView: View { content: { image in image .resizable() - .frame(width: 90, height: 120) + .frame(width: 96, height: 96) .blur(radius: 18) }, placeholder: { Color.black - .frame(width: 90, height: 120) + .frame(width: 96, height: 96) .overlay { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -49,26 +49,28 @@ public struct UnsentDirectMessageListContentReceivedLikeRowView: View { } } ) - .clipShape(RoundedRectangle(cornerRadius: 6)) .overlay { RoundedRectangle(cornerRadius: 6) - .stroke(goldGradient, lineWidth: 3) + .stroke(goldGradient, lineWidth: 4) } + .clipShape(RoundedRectangle(cornerRadius: 6)) .overlay { - Text(viewStore.displayCount) - .font(.system(.body, weight: .semibold)) - .frame(width: 40, height: 40) - .foregroundStyle(Color.white) - .background(goldGradient) - .clipShape(Circle()) - } - .overlay(alignment: .bottom) { - Image(ImageResource.receivedLike) - .offset(y: 17) + HStack(alignment: .center, spacing: 0) { + Text(Image(systemName: "heart.fill")) + .font(.system(size: 14)) + + Text(viewStore.displayCount) + .font(.system(.body, design: .rounded, weight: .semibold)) + } + .foregroundStyle(Color.black) + .padding(.vertical, 4) + .padding(.horizontal, 6) + .background(goldGradient) + .clipShape(RoundedRectangle(cornerRadius: .infinity)) } - Text("Like", bundle: .module) - .font(.system(.subheadline, weight: .semibold)) + Text("Likes", bundle: .module) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .foregroundStyle(Color.primary) } } diff --git a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift index e3de5d1a..e676c782 100644 --- a/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift +++ b/Packages/PicMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift @@ -25,11 +25,12 @@ public struct UnsentDirectMessageListContentRowView: View { content: { image in image .resizable() - .frame(width: 90, height: 120) + .aspectRatio(contentMode: .fill) + .frame(width: 96, height: 120) }, placeholder: { Color.black - .frame(width: 90, height: 120) + .frame(width: 96, height: 120) .overlay { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -37,22 +38,18 @@ public struct UnsentDirectMessageListContentRowView: View { } } ) - .clipShape(RoundedRectangle(cornerRadius: 6)) + .clipShape(RoundedRectangle(cornerRadius: 8)) .overlay(alignment: .bottom) { if !viewStore.isRead { - Color.pink + Color.red .frame(width: 16, height: 16) .clipShape(Circle()) - .overlay { - RoundedRectangle(cornerRadius: 16 / 2) - .stroke(Color.white, lineWidth: 2) - } - .offset(y: 10) + .offset(y: 8) } } Text(viewStore.displayName) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .foregroundStyle(Color.primary) } } diff --git a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift b/Packages/PicMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift index 31f38ae9..ef34b66b 100644 --- a/Packages/PicMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift +++ b/Packages/PicMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift @@ -14,30 +14,37 @@ public struct DisplayNameSettingView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 32) { - Text("What's your nick name?", bundle: .module) - .frame(height: 50) - .font(.system(.title3, weight: .semibold)) + VStack(spacing: 8) { + Text("Set your nick name", bundle: .module) + .font(.system(.title2, weight: .bold)) + + VStack(spacing: 32) { + Text("ex. tomokisun", bundle: .module) + .font(.caption) + .tint(Color.gray) + .foregroundStyle(Color.gray) - VStack(spacing: 0) { TextField("", text: viewStore.$displayName) .foregroundStyle(Color.white) .textInputAutocapitalization(.never) .autocorrectionDisabled() + .frame(height: 56) .focused($isFocused) + .background(Color(uiColor: UIColor.systemFill)) + .font(.system(.title3, design: .rounded, weight: .semibold)) + .clipShape(RoundedRectangle(cornerRadius: 12)) } - .font(.system(.title3, weight: .semibold)) Spacer() PrimaryButton( - String(localized: "Next", bundle: .module), + String(localized: "Continue", bundle: .module), isLoading: viewStore.isActivityIndicatorVisible ) { store.send(.nextButtonTapped) } } - .padding(.top, 24) + .padding(.top, 32) .padding(.bottom, 16) .padding(.horizontal, 16) .multilineTextAlignment(.center) diff --git a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings index a3b27781..c9fdfe50 100644 --- a/Packages/PicMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings @@ -4,40 +4,98 @@ "" : { }, - "Next" : { + "Continue" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Suivant" + "value" : "Continuer" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "つぎへ" + "value" : "続ける" } }, "ko" : { "stringUnit" : { "state" : "translated", - "value" : "다음" + "value" : "계속" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Tiếp theo" + "value" : "Tiếp tục" } } } }, - "What's your nick name?" : { + "ex. tomokisun" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ej. tomokisun" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quel est votre surnom ?" + "value" : "ex. tomokisun" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "例: ともき" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "예: tomokisun" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "np. tomokisun" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ví dụ: tomokisun" + } + } + } + }, + "Set your nick name" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Establece tu apodo" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Définissez votre pseudo" } }, "ja" : { @@ -49,17 +107,23 @@ "ko" : { "stringUnit" : { "state" : "translated", - "value" : "닉네임이 무엇인가요?" + "value" : "별명을 설정하세요" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ustaw swój pseudonim" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Biệt danh của bạn là gì?" + "value" : "Đặt biệt danh của bạn" } } } } }, "version" : "1.0" -} \ No newline at end of file +} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/Contents.json b/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/Contents.json b/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/Contents.json deleted file mode 100644 index 08da8a12..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "empty.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/empty.pdf b/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/empty.pdf deleted file mode 100644 index 5fd7c8fc..00000000 Binary files a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/empty.imageset/empty.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 8689b400..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "be-match.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/ExplorerFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Explorer.swift b/Packages/PicMatch/Sources/ExplorerFeature/Explorer.swift deleted file mode 100644 index d89146c6..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/Explorer.swift +++ /dev/null @@ -1,42 +0,0 @@ -import ComposableArchitecture -import ExplorerLogic -import SwiftUI - -public struct ExplorerView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStack { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - case .empty: - CaseLet( - /ExplorerLogic.State.empty, - action: ExplorerLogic.Action.empty, - then: ExplorerEmptyView.init(store:) - ) - case .content: - CaseLet( - /ExplorerLogic.State.content, - action: ExplorerLogic.Action.content, - then: ExplorerContentView.init(store:) - ) - } - } - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContent.swift b/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContent.swift deleted file mode 100644 index 8318ebad..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContent.swift +++ /dev/null @@ -1,36 +0,0 @@ -import ComposableArchitecture -import ExplorerLogic -import MembershipFeature -import SwiftUI - -public struct ExplorerContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - ScrollView(.vertical) { - VStack(spacing: 24) { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: ExplorerContentSectionView.init(store:) - ) - } - .padding(.top, 16) - .padding(.bottom, 48) - } - .fullScreenCover( - store: store.scope(state: \.$destination.swipe, action: \.destination.swipe) - ) { store in - NavigationStack { - ExplorerSwipeView(store: store) - } - } - .fullScreenCover( - store: store.scope(state: \.$destination.membership, action: \.destination.membership), - content: MembershipView.init(store:) - ) - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentRow.swift b/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentRow.swift deleted file mode 100644 index cb692f1f..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentRow.swift +++ /dev/null @@ -1,75 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import ExplorerLogic -import Styleguide -import SwiftUI - -public struct ExplorerContentRowView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - var goldGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped) - } label: { - CachedAsyncImage( - url: URL(string: viewStore.user.images[0].imageUrl), - urlCache: URLCache.shared, - scale: displayScale - ) { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: 150, height: 200) - } placeholder: { - Color.black - .frame(width: 150, height: 200) - .overlay { - ProgressView() - .tint(Color.white) - } - } - .blur(radius: viewStore.isBlur ? 18 : 0) - .clipShape(RoundedRectangle(cornerRadius: 8)) - .overlay(alignment: .bottom) { - if !viewStore.isBlur { - LinearGradient( - colors: [ - Color.black.opacity(0.0), - Color.black.opacity(1.0), - ], - startPoint: .top, - endPoint: .bottom - ) - .frame(height: 100) - .clipShape(RoundedRectangle(cornerRadius: 8)) - } - } - .overlay { - if viewStore.isBlur { - RoundedRectangle(cornerRadius: 8) - .stroke(goldGradient, lineWidth: 3) - } - } - .padding(.vertical, 2) - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentSection.swift b/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentSection.swift deleted file mode 100644 index c2fb9faf..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerContentSection.swift +++ /dev/null @@ -1,32 +0,0 @@ -import ComposableArchitecture -import ExplorerLogic -import SwiftUI - -public struct ExplorerContentSectionView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(alignment: .leading, spacing: 8) { - Text(viewStore.explorer.title) - .foregroundStyle(Color.secondary) - .font(.system(.headline, weight: .semibold)) - .padding(.horizontal, 16) - - ScrollView(.horizontal, showsIndicators: false) { - LazyHStack(spacing: 12) { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: ExplorerContentRowView.init(store:) - ) - } - .padding(.horizontal, 16) - } - } - } - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerEmpty.swift b/Packages/PicMatch/Sources/ExplorerFeature/ExplorerEmpty.swift deleted file mode 100644 index 96b7353c..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerEmpty.swift +++ /dev/null @@ -1,44 +0,0 @@ -import ComposableArchitecture -import ExplorerLogic -import Styleguide -import SwiftUI - -public struct ExplorerEmptyView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - VStack(spacing: 24) { - Image(ImageResource.empty) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 120) - - Text("Looks like he's gone.", bundle: .module) - .font(.system(.title3, weight: .semibold)) - - PrimaryButton( - String(localized: "Swipe others", bundle: .module) - ) { - store.send(.emptyButtonTapped) - } - } - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - } -} - -#Preview { - NavigationStack { - ExplorerEmptyView( - store: .init( - initialState: ExplorerEmptyLogic.State(), - reducer: { ExplorerEmptyLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerSwipe.swift b/Packages/PicMatch/Sources/ExplorerFeature/ExplorerSwipe.swift deleted file mode 100644 index bcb7b0b1..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/ExplorerSwipe.swift +++ /dev/null @@ -1,57 +0,0 @@ -import ComposableArchitecture -import ExplorerLogic -import SwiftUI -import SwipeFeature - -public struct ExplorerSwipeView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .content: - CaseLet( - /ExplorerSwipeLogic.Child.State.content, - action: ExplorerSwipeLogic.Child.Action.content, - then: SwipeView.init(store:) - ) - .padding(.horizontal, 16) - case .empty: - CaseLet( - /ExplorerSwipeLogic.Child.State.empty, - action: ExplorerSwipeLogic.Child.Action.empty, - then: ExplorerEmptyView.init(store:) - ) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background( - LinearGradient( - colors: viewStore.colors, - startPoint: UnitPoint.top, - endPoint: UnitPoint.bottom - ) - ) - .navigationTitle(viewStore.title) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "chevron.down") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } - } -} diff --git a/Packages/PicMatch/Sources/ExplorerFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ExplorerFeature/Localizable.xcstrings deleted file mode 100644 index b653126e..00000000 --- a/Packages/PicMatch/Sources/ExplorerFeature/Localizable.xcstrings +++ /dev/null @@ -1,63 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Looks like he's gone." : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "On dirait qu'il est parti." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "もういないみたい..." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Có vẻ như anh ấy đã đi rồi." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "그가 떠난 것 같아요." - } - } - } - }, - "Swipe others" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Balayer d'autres" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "他の人をスワイプする" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt những người khác" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "다른 사람들 스와이프" - } - } - } - } - }, - "version" : "1.0" -} - diff --git a/Packages/PicMatch/Sources/ForceUpdateFeature/ForceUpdate.swift b/Packages/PicMatch/Sources/ForceUpdateFeature/ForceUpdate.swift index 3bf1efde..52460a92 100644 --- a/Packages/PicMatch/Sources/ForceUpdateFeature/ForceUpdate.swift +++ b/Packages/PicMatch/Sources/ForceUpdateFeature/ForceUpdate.swift @@ -14,10 +14,10 @@ public struct ForceUpdateView: View { WithViewStore(store, observe: { $0 }) { _ in VStack(spacing: 24) { Text("Notice", bundle: .module) - .font(.system(.title, weight: .semibold)) + .font(.system(.title, design: .rounded, weight: .semibold)) - Text("... Oh? ! ! Looks like BeMatch...! \nPlease update to the latest version.", bundle: .module) - .font(.system(.body, weight: .semibold)) + Text("... Oh? ! ! Looks like TenMatch...! \nPlease update to the latest version.", bundle: .module) + .font(.system(.body, design: .rounded, weight: .semibold)) PrimaryButton( String(localized: "Update", bundle: .module) diff --git a/Packages/PicMatch/Sources/ForceUpdateFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ForceUpdateFeature/Localizable.xcstrings index 3442d07a..56ddd35f 100644 --- a/Packages/PicMatch/Sources/ForceUpdateFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ForceUpdateFeature/Localizable.xcstrings @@ -1,91 +1,126 @@ { - "sourceLanguage": "en", - "strings": { - "... Oh? ! ! Looks like BeMatch...! \nPlease update to the latest version.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "...おや?!BeMatch.のようすが...!\n最新バージョンへのアップデートをお願いします。" + "sourceLanguage" : "en", + "strings" : { + "... Oh? ! ! Looks like TenMatch...! \nPlease update to the latest version." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "...おや?!TenMatchのようすが...!\n最新バージョンへのアップデートをお願いします。" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "... Oh? ! ! On dirait BeMatch... ! \nVeuillez mettre à jour vers la dernière version." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "...오? ! ! TenMatch처럼 보이네요...! \n최신 버전으로 업데이트해 주세요." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "... Ồ? ! ! Có vẻ như BeMatch...! \nVui lòng cập nhật lên phiên bản mới nhất." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "... Oh ? ! ! On dirait TenMatch...! \nVeuillez mettre à jour vers la dernière version." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "... 오? ! ! BeMatch인 것 같아요...! \n최신 버전으로 업데이트 해주세요." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "... Och? ! ! Wygląda na TenMatch...! \nProszę zaktualizować do najnowszej wersji." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "... Ồ? ! ! Trông giống như TenMatch...! \nVui lòng cập nhật lên phiên bản mới nhất." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "... ¡Oh? ! ! Parece TenMatch...! \nPor favor, actualiza a la última versión." } } } }, - "Notice": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "お知らせ" + "Notice" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お知らせ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공지" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Avis" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Avis" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thông báo" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Powiadomienie" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "공지" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thông báo" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aviso" } } } }, - "Update": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "アップデート" + "Update" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アップデート" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업데이트" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mettre à jour" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Mettre à jour" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktualizować" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Cập nhật" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cập nhật" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "업데이트" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualizar" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/FreezedFeature/Freezed.swift b/Packages/PicMatch/Sources/FreezedFeature/Freezed.swift index 36194171..76408def 100644 --- a/Packages/PicMatch/Sources/FreezedFeature/Freezed.swift +++ b/Packages/PicMatch/Sources/FreezedFeature/Freezed.swift @@ -18,9 +18,9 @@ public struct FreezedView: View { .frame(width: 120) Text("Currently unable to re-register", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) - Text("Once you have deleted your BeMatch account, you will not be able to register again for a certain period of time after the deletion.", bundle: .module) + Text("Once you have deleted your TenMatch account, you will not be able to register again for a certain period of time after the deletion.", bundle: .module) Text("Please answer our simple questionnaire to help us improve our service.", bundle: .module) diff --git a/Packages/PicMatch/Sources/FreezedFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/FreezedFeature/Localizable.xcstrings index b6f5f0d4..f1ab9973 100644 --- a/Packages/PicMatch/Sources/FreezedFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/FreezedFeature/Localizable.xcstrings @@ -3,112 +3,160 @@ "strings" : { "Answer" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "回答する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "답변" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Répondre" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "回答する" + "value" : "Odpowiedz" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Trả lời" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trả lời" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "답변" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Responder" } } } }, "Currently unable to re-register" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "現在再登録することができません" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "현재 재등록할 수 없습니다" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Actuellement impossible de se réinscrire" + "value" : "Impossible de se réinscrire actuellement" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "現在再登録することができません" + "value" : "Obecnie brak możliwości ponownej rejestracji" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Hiện không thể đăng ký lại" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hiện không thể đăng ký lại" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "현재 재등록 불가" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Actualmente no es posible volver a registrarse" } } } }, - "Once you have deleted your BeMatch account, you will not be able to register again for a certain period of time after the deletion." : { + "Once you have deleted your TenMatch account, you will not be able to register again for a certain period of time after the deletion." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "一度TenMatchのアカウント削除をされた方は、削除してから一定期間は再登録していただくことができません。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch 계정을 삭제하면 삭제 후 일정 기간 동안 다시 등록할 수 없습니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Une fois que vous avez supprimé votre compte BeMatch, vous ne pourrez pas vous réinscrire pendant une certaine période après la suppression." + "value" : "Une fois que vous avez supprimé votre compte TenMatch, vous ne pourrez pas vous réinscrire pendant une certaine période après la suppression." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "一度BeMatchのアカウント削除をされた方は、削除してから一定期間は再登録していただくことができません。" + "value" : "Po usunięciu konta TenMatch, nie będzie można ponownie zarejestrować się przez pewien czas po usunięciu." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Sau khi bạn đã xóa tài khoản BeMatch của mình, bạn sẽ không thể đăng ký lại trong một khoảng thời gian nhất định sau khi xóa." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sau khi xóa tài khoản TenMatch của bạn, bạn sẽ không thể đăng ký lại trong một khoảng thời gian nhất định sau khi xóa." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "BeMatch 계정을 삭제하면 삭제 후 일정 기간 동안 다시 등록할 수 없습니다." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Una vez que hayas eliminado tu cuenta de TenMatch, no podrás registrarte nuevamente por un cierto período de tiempo después de la eliminación." } } } }, "Please answer our simple questionnaire to help us improve our service." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サービス改善のためにかんたんなアンケートへのご回答お願いします。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "서비스 개선을 위해 간단한 설문지에 답변해 주세요." + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Veuillez répondre à notre simple questionnaire pour nous aider à améliorer notre service." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "サービス改善のためにかんたんなアンケートへのご回答お願いします。" + "value" : "Prosimy o odpowiedź na naszą prostą ankietę, aby pomóc nam poprawić nasze usługi." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Vui lòng trả lời bảng câu hỏi đơn giản của chúng tôi để giúp chúng tôi cải thiện dịch vụ của mình." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vui lòng trả lời bảng câu hỏi đơn giản của chúng tôi để giúp chúng tôi cải thiện dịch vụ của mình." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "서비스 개선을 위해 간단한 설문지에 답변해 주세요." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por favor, responda a nuestro sencillo cuestionario para ayudarnos a mejorar nuestro servicio." } } } @@ -116,4 +164,3 @@ }, "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/GenderSettingFeature/GenderSetting.swift b/Packages/PicMatch/Sources/GenderSettingFeature/GenderSetting.swift index 42c7be99..842005b8 100644 --- a/Packages/PicMatch/Sources/GenderSettingFeature/GenderSetting.swift +++ b/Packages/PicMatch/Sources/GenderSettingFeature/GenderSetting.swift @@ -27,8 +27,8 @@ public struct GenderSettingView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 0) { - Text("What's your gender?", bundle: .module) - .font(.system(.title3, weight: .semibold)) + Text("Please tell us your gender.", bundle: .module) + .font(.system(.title2, weight: .bold)) List(viewStore.genders, id: \.self) { gender in Button { @@ -40,9 +40,9 @@ public struct GenderSettingView: View { } } label: { Text(gender.displayValue) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) } - .frame(height: 50) + .frame(height: 44) } } .scrollDisabled(true) @@ -54,7 +54,7 @@ public struct GenderSettingView: View { PrimaryButton( nextButtonStyle == .save ? String(localized: "Save", bundle: .module) - : String(localized: "Next", bundle: .module), + : String(localized: "Continue", bundle: .module), isLoading: viewStore.isActivityIndicatorVisible, isDisabled: viewStore.selection == nil ) { @@ -68,13 +68,13 @@ public struct GenderSettingView: View { Text("Skip", bundle: .module) .frame(height: 50) .foregroundStyle(Color.white) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) } } } .padding(.horizontal, 16) } - .padding(.top, 24) + .padding(.top, 32) .padding(.bottom, 16) .multilineTextAlignment(.center) .navigationBarTitleDisplayMode(.inline) diff --git a/Packages/PicMatch/Sources/GenderSettingFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/GenderSettingFeature/Localizable.xcstrings index 2b655817..0438b509 100644 --- a/Packages/PicMatch/Sources/GenderSettingFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/GenderSettingFeature/Localizable.xcstrings @@ -1,120 +1,167 @@ { - "sourceLanguage": "en", - "strings": { - "Next": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "つぎへ" + "sourceLanguage" : "en", + "strings" : { + "Continue" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "続ける" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Suivant" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Tiếp theo" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다음" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" } } } }, - "Save": { - "extractionState": "manual", - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "保存する" + "Please tell us your gender." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "性別を設定してください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "성별을 알려주세요." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veuillez nous indiquer votre sexe." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Enregistrer" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proszę podać swoją płeć." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Lưu" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vui lòng cho chúng tôi biết giới tính của bạn." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "저장" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por favor, dinos tu género." } } } }, - "Skip": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "スキップ" + "Save" : { + "extractionState" : "manual", + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存する" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Passer" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Bỏ qua" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enregistrer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "건너뛰기" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapisz" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lưu" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guardar" } } } }, - "What's your gender?": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "性別を教えてください" + "Skip" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スキップ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "건너뛰기" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Passer" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Quel est votre genre ?" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomiń" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Giới tính của bạn là gì?" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bỏ qua" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "성별이 무엇인가요?" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omitir" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/HowToMovieFeature/HowToMovie.swift b/Packages/PicMatch/Sources/HowToMovieFeature/HowToMovie.swift index c86dcbcc..ab0d0b80 100644 --- a/Packages/PicMatch/Sources/HowToMovieFeature/HowToMovie.swift +++ b/Packages/PicMatch/Sources/HowToMovieFeature/HowToMovie.swift @@ -14,20 +14,20 @@ public struct HowToMovieView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 36) { - Text(#"Press "Add to Photo" in memory and save it 📸."#, bundle: .module) - .font(.system(.title3, weight: .semibold)) + Text("In the tenten, select your favorites and tap 'Save' 📸.", bundle: .module) + .font(.system(.title2, weight: .bold)) VideoPlayer(player: viewStore.player) Spacer() PrimaryButton( - String(localized: "Next", bundle: .module) + String(localized: "Continue", bundle: .module) ) { store.send(.nextButtonTapped) } } - .padding(.top, 24) + .padding(.top, 32) .padding(.bottom, 16) .padding(.horizontal, 16) .background(Color.black) diff --git a/Packages/PicMatch/Sources/HowToMovieFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/HowToMovieFeature/Localizable.xcstrings index ee7f6b33..7f80221a 100644 --- a/Packages/PicMatch/Sources/HowToMovieFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/HowToMovieFeature/Localizable.xcstrings @@ -1,63 +1,86 @@ { - "sourceLanguage": "en", - "strings": { - "Next": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "つぎへ" + "sourceLanguage" : "en", + "strings" : { + "Continue" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "続ける" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Suivant" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Tiếp theo" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다음" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" } } } }, - "Press \"Add to Photo\" in memory and save it 📸.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "メモリーで、お気に入りを選んで「写真に追加」で保存してね 📸" + "In the tenten, select your favorites and tap 'Save' 📸." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenでお気に入りを選択し、「保存」📸をタップします。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "tenten에서 즐겨찾기를 선택하고 '저장' 📸을(를) 탭하세요." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dans le tenten, sélectionnez vos favoris et appuyez sur 'Enregistrer' 📸." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Appuyez sur \"Ajouter à la photo\" en mémoire et enregistrez-le 📸." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W tenten wybierz swoje ulubione i dotknij 'Zapisz' 📸." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Nhấn \"Thêm vào Ảnh\" trong bộ nhớ và lưu lại 📸." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Trong tenten, chọn những mục yêu thích của bạn và nhấn 'Lưu' 📸." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "메모리에서 \"사진에 추가\"를 눌러 저장하세요 📸." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "En el tenten, selecciona tus favoritos y toca 'Guardar' 📸." } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/InvitationCodeFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/InvitationCodeFeature/Localizable.xcstrings index 41808328..2b9f4aa3 100644 --- a/Packages/PicMatch/Sources/InvitationCodeFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/InvitationCodeFeature/Localizable.xcstrings @@ -1,35 +1,46 @@ { - "sourceLanguage": "en", - "strings": { - "Invitation Code": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "招待コード" + "sourceLanguage" : "en", + "strings" : { + "Invitation Code" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待コード" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Code d'invitation" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초대 코드" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Mã mời" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Code d'invitation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "초대 코드" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kod zaproszenia" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mã mời" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Código de invitación" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/InvitationFeature/Invitation.swift b/Packages/PicMatch/Sources/InvitationFeature/Invitation.swift index dae7f734..51ef859f 100644 --- a/Packages/PicMatch/Sources/InvitationFeature/Invitation.swift +++ b/Packages/PicMatch/Sources/InvitationFeature/Invitation.swift @@ -16,7 +16,7 @@ public struct InvitationView: View { VStack(spacing: 32) { Text("If you have an invitation code.\nPlease let us know.", bundle: .module) .frame(height: 50) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) TextField(text: viewStore.$code) { Text("Invitation Code", bundle: .module) @@ -26,13 +26,13 @@ public struct InvitationView: View { .textInputAutocapitalization(.never) .autocorrectionDisabled() .focused($isFocused) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) Spacer() VStack(spacing: 0) { PrimaryButton( - String(localized: "Next", bundle: .module), + String(localized: "Continue", bundle: .module), isLoading: viewStore.isActivityIndicatorVisible, isDisabled: viewStore.isDisabled ) { @@ -45,7 +45,7 @@ public struct InvitationView: View { Text("Skip", bundle: .module) .frame(height: 50) .foregroundStyle(Color.white) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) } } } diff --git a/Packages/PicMatch/Sources/InvitationFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/InvitationFeature/Localizable.xcstrings index a92c5b5f..a2166e22 100644 --- a/Packages/PicMatch/Sources/InvitationFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/InvitationFeature/Localizable.xcstrings @@ -1,119 +1,166 @@ { - "sourceLanguage": "en", - "strings": { - "If you have an invitation code.\nPlease let us know.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "招待コードがあれば\n教えてください" + "sourceLanguage" : "en", + "strings" : { + "Continue" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "続ける" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Si vous avez un code d'invitation.\nVeuillez nous le faire savoir." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Nếu bạn có mã mời.\nVui lòng cho chúng tôi biết." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuer" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "초대 코드가 있으면\n알려주세요." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" } } } }, - "Invitation Code": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "招待コード" + "If you have an invitation code.\nPlease let us know." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待コードがあれば\n教えてください" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초대 코드가 있으면 알려주세요." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si vous avez un code d'invitation, \nveuillez nous en informer." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Code d'invitation" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jeśli masz kod zaproszenia.\nProszę, daj nam znać." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Mã mời" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nếu bạn có mã mời.\nVui lòng cho chúng tôi biết." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "초대 코드" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si tienes un código de invitación.\nPor favor, háznoslo saber." } } } }, - "Next": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "つぎへ" + "Invitation Code" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待コード" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Suivant" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초대 코드" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Tiếp theo" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Code d'invitation" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "다음" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kod zaproszenia" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mã mời" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Código de invitación" } } } }, - "Skip": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "スキップ" + "Skip" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スキップ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "건너뛰기" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Passer" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Passer" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomiń" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Bỏ qua" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bỏ qua" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "건너뛰기" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Omitir" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Contents.json b/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Contents.json deleted file mode 100644 index 24d046a8..00000000 --- a/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Logo.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Logo.pdf b/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Logo.pdf deleted file mode 100644 index c4cc37e7..00000000 Binary files a/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/Logo.imageset/Logo.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Contents.json rename to Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Contents.json diff --git a/Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Frame 625057.pdf b/Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Frame 625057.pdf similarity index 100% rename from Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Frame 625057.pdf rename to Packages/PicMatch/Sources/LaunchFeature/Assets.xcassets/logo.imageset/Frame 625057.pdf diff --git a/Packages/PicMatch/Sources/LaunchFeature/Launch.swift b/Packages/PicMatch/Sources/LaunchFeature/Launch.swift index 95bf2abc..d2eccee0 100644 --- a/Packages/PicMatch/Sources/LaunchFeature/Launch.swift +++ b/Packages/PicMatch/Sources/LaunchFeature/Launch.swift @@ -16,13 +16,13 @@ public struct LaunchView: View { .aspectRatio(contentMode: .fit) .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea() - .background(Color(0xFFFD_2D76)) + .background(Color(0xFFFF_0000)) .task { await store.send(.onTask).finish() } .overlay { if viewStore.isActivityIndicatorVisible { ProgressView() .tint(Color.white) - .offset(y: 40) + .offset(y: 114) } } } diff --git a/Packages/PicMatch/Sources/MaintenanceFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/MaintenanceFeature/Localizable.xcstrings index 4071d139..b510784e 100644 --- a/Packages/PicMatch/Sources/MaintenanceFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/MaintenanceFeature/Localizable.xcstrings @@ -1,90 +1,126 @@ { - "sourceLanguage": "en", - "strings": { - "Contact us": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "お問い合わせ" + "sourceLanguage" : "en", + "strings" : { + "Contact us" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お問い合わせ" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Contactez-nous" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "문의하기" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Liên hệ với chúng tôi" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contactez-nous" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "문의하기" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skontaktuj się z nami" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Liên hệ với chúng tôi" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contáctanos" } } } }, - "Please wait for a while until service resumes.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "サービス再開までしばらくお待ち下さい。" + "Please wait for a while until service resumes." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サービス再開までしばらくお待ち下さい。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "서비스가 재개될 때까지 잠시 기다려주십시오." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Veuillez patienter un moment jusqu'à ce que le service reprenne." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veuillez patienter un moment jusqu'à la reprise du service." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Vui lòng đợi một chút cho đến khi dịch vụ hoạt động trở lại." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proszę czekać na wznowienie usługi." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "서비스가 재개될 때까지 잠시 기다려 주십시오." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vui lòng đợi một lát cho đến khi dịch vụ được tiếp tục." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por favor, espere un momento hasta que se reanude el servicio." } } } }, - "Under Maintenance": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "メンテナンス中" + "Under Maintenance" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メンテナンス中" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "점검 중" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "En maintenance" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "En maintenance" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W trakcie konserwacji" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Đang bảo trì" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đang bảo trì" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "점검 중" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "En mantenimiento" } } } } }, - "version": "1.0" + "version" : "1.0" } diff --git a/Packages/PicMatch/Sources/MaintenanceFeature/Maintenance.swift b/Packages/PicMatch/Sources/MaintenanceFeature/Maintenance.swift index 02dd0a2a..5f6c49aa 100644 --- a/Packages/PicMatch/Sources/MaintenanceFeature/Maintenance.swift +++ b/Packages/PicMatch/Sources/MaintenanceFeature/Maintenance.swift @@ -15,15 +15,15 @@ public struct MaintenanceView: View { VStack(spacing: 80) { VStack(spacing: 24) { Text("Under Maintenance", bundle: .module) - .font(.system(.title, weight: .semibold)) + .font(.system(.title, design: .rounded, weight: .semibold)) Text("Please wait for a while until service resumes.", bundle: .module) - .font(.system(.body, weight: .semibold)) + .font(.system(.body, design: .rounded, weight: .semibold)) } Link(destination: viewStore.contactUsURL) { Text("Contact us", bundle: .module) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(height: 50) .frame(maxWidth: .infinity) .foregroundStyle(Color.black) diff --git a/Packages/PicMatch/Sources/MatchEmptyFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/MatchEmptyFeature/Localizable.xcstrings index 1d845d3f..5b07cde6 100644 --- a/Packages/PicMatch/Sources/MatchEmptyFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/MatchEmptyFeature/Localizable.xcstrings @@ -1,91 +1,126 @@ { - "sourceLanguage": "en", - "strings": { - "Let's swipe.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "スワイプしよう" + "sourceLanguage" : "en", + "strings" : { + "Let's swipe." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スワイプしよう" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Faisons glisser." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스와이프 하자." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Hãy vuốt." + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Swipez." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스와이프 해요." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przesuń." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuốt." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desliza." } } } }, - "Swipe": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "スワイプする" + "Swipe" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スワイプする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스와이프" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Glisser" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Swipe" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Vuốt" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Przesuń" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "스와이프" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuốt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desliza" } } } }, - "When you match with someone, their profile will appear here": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "誰かとマッチするとここに相手のプロフィールが表示されます" + "When you match with someone, their profile will appear here" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "誰かとマッチするとここに相手のプロフィールが表示されます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "누군가와 매치되면 프로필이 여기에 표시됩니다" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lorsque vous faites une correspondance avec quelqu'un, son profil apparaîtra ici" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Lorsque vous correspondez avec quelqu'un, son profil apparaîtra ici" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gdy dopasujesz się z kimś, jego profil pojawi się tutaj" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Khi bạn kết nối với ai đó, hồ sơ của họ sẽ xuất hiện ở đây" + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khi bạn phù hợp với ai đó, hồ sơ của họ sẽ xuất hiện ở đây" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "누군가와 매치되면 프로필이 여기에 나타납니다" + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cuando coincidas con alguien, su perfil aparecerá aquí" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/MatchEmptyFeature/MatchEmpty.swift b/Packages/PicMatch/Sources/MatchEmptyFeature/MatchEmpty.swift index 4c9124b2..94a4cfcc 100644 --- a/Packages/PicMatch/Sources/MatchEmptyFeature/MatchEmpty.swift +++ b/Packages/PicMatch/Sources/MatchEmptyFeature/MatchEmpty.swift @@ -23,7 +23,7 @@ public struct MatchEmptyView: View { .font(.system(.largeTitle, weight: .bold)) Text("When you match with someone, their profile will appear here", bundle: .module) - .font(.system(.callout, weight: .semibold)) + .font(.system(.callout, design: .rounded, weight: .semibold)) PrimaryButton( String(localized: "Swipe", bundle: .module) diff --git a/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json b/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json index 0a7fc011..dd0f1614 100644 --- a/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json +++ b/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "matched.pdf", + "filename" : "Frame 625063.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Frame 625063.pdf b/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Frame 625063.pdf similarity index 100% rename from Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Frame 625063.pdf rename to Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Frame 625063.pdf diff --git a/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/matched.pdf b/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/matched.pdf deleted file mode 100644 index a68fe10f..00000000 Binary files a/Packages/PicMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/matched.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/MatchedFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/MatchedFeature/Localizable.xcstrings index 458b9387..d744dc8e 100644 --- a/Packages/PicMatch/Sources/MatchedFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/MatchedFeature/Localizable.xcstrings @@ -1,63 +1,126 @@ { - "sourceLanguage": "en", - "strings": { - "🔗 %@": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "🔗 %@" + "sourceLanguage" : "en", + "strings" : { + "🧷 %@" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "🔗 %@" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "🔗 %@" + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "🔗 %@" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "🧷 %@" + } + } + } + }, + "Copy tenten’s PIN" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copiar el PIN de tenten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copier le PIN de tenten" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenのPINをコピー" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "tenten의 PIN 복사" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skopiuj PIN tenten" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sao chép PIN của tenten" } } } }, - "Add BeReal.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "BeRealを追加する" + "You matched with %@" : { + "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Has hecho coincidir con %@!" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous avez été jumelé avec %@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@さんとマッチしました" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Ajouter BeReal." + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@님과 매칭되었습니다" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Thêm BeReal." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dopasowano z %@" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "BeReal 추가." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn đã kết hợp với %@" } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/MatchedFeature/Matched.swift b/Packages/PicMatch/Sources/MatchedFeature/Matched.swift index 311d63b2..7b22e7e7 100644 --- a/Packages/PicMatch/Sources/MatchedFeature/Matched.swift +++ b/Packages/PicMatch/Sources/MatchedFeature/Matched.swift @@ -1,9 +1,11 @@ +import CachedAsyncImage import ComposableArchitecture import MatchedLogic import Styleguide import SwiftUI public struct MatchedView: View { + @Environment(\.displayScale) var displayScale @Environment(\.requestReview) var requestReview let store: StoreOf @@ -13,26 +15,64 @@ public struct MatchedView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 40) { - Image(ImageResource.matched) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(height: 240) + VStack(spacing: 0) { + VStack(spacing: 16) { + Image(ImageResource.matched) + .resizable() + .aspectRatio(contentMode: .fit) + + HStack(spacing: -12) { + ForEach( + [viewStore.currentUserImageUrl, viewStore.targetUserImageUrl], + id: \.self + ) { imageUrl in + CachedAsyncImage( + url: imageUrl, + urlCache: URLCache.shared, + scale: displayScale, + content: { image in + image + .resizable() + }, + placeholder: { + Color.clear + .overlay { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .tint(Color.white) + } + } + ) + .aspectRatio(1, contentMode: .fill) + .clipShape(Circle()) + .frame(width: 128, height: 128) + .overlay( + RoundedRectangle(cornerRadius: 128 / 2) + .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 2.0) + ) + } + } + + Text("You matched with \(viewStore.targetUserDisplayName)", bundle: .module) + .foregroundStyle(Color.white) + .font(.system(.headline, design: .rounded, weight: .semibold)) + } + .frame(maxHeight: .infinity) + .padding(.horizontal, 37) VStack(spacing: 12) { PrimaryButton( - String(localized: "Add BeReal.", bundle: .module) + String(localized: "Copy tenten’s PIN", bundle: .module) ) { store.send(.addExternalProductButtonTapped) } - Text("🔗 \(viewStore.displayTargetUserInfo)", bundle: .module) + Text("🧷 \(viewStore.displayTargetUserInfo)", bundle: .module) .foregroundStyle(Color.white) - .font(.system(.caption, weight: .semibold)) + .font(.system(.caption, design: .rounded, weight: .semibold)) } } .padding(.horizontal, 16) - .ignoresSafeArea() .frame(maxWidth: .infinity, maxHeight: .infinity) .task { requestReview() @@ -43,29 +83,56 @@ public struct MatchedView: View { store.send(.closeButtonTapped) } label: { Image(systemName: "xmark") - .bold() + .font(.system(size: 12, weight: .regular)) + .frame(width: 36, height: 36) .foregroundStyle(Color.white) - .padding(.all, 24) + .background(Color(uiColor: UIColor.quaternarySystemFill)) + .clipShape(Circle()) } + .padding(.horizontal, 12) } .background( - Color.clear - .compositingGroup() - .onTapGesture { - store.send(.closeButtonTapped) - } - ) - .presentationBackground( LinearGradient( colors: [ - Color(0xFFFE_7056), - Color(0xFFFD_2D76), + Color(0xFF30_D158), + Color(0xFFFF_D60A), + Color(0xFFFF_2E00), + Color(0xFF00_0000), ], - startPoint: .topTrailing, - endPoint: .bottomLeading + startPoint: .top, + endPoint: .bottom ) - .opacity(0.95) + ) + .alert( + store: store.scope(state: \.$destination.alert, action: \.destination.alert) ) } } } + +#Preview { + NavigationStack { + MatchedView( + store: .init( + initialState: MatchedLogic.State( + targetUserId: "", + displayName: "tomokisun", + tentenPinCode: "du9v5pq", + externalProductURL: URL(string: "https://bere.al/tomokisun")! + ), + reducer: MatchedLogic.init, + withDependencies: { + $0.environment = .live( + brand: .tenmatch, + instagramUsername: "", + appId: "", + appStoreForEmptyURL: .applicationDirectory, + docsURL: .applicationDirectory, + howToMovieURL: .applicationDirectory + ) + } + ) + ) + } + .environment(\.colorScheme, .dark) +} diff --git a/Packages/PicMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf b/Packages/PicMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf index d4c150ed..9fa265c5 100644 Binary files a/Packages/PicMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf and b/Packages/PicMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf differ diff --git a/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift b/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift index 9d9290da..fa8ccf06 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift @@ -4,21 +4,12 @@ import SwiftUI struct ConversionPrimaryButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { configuration.label - .font(.system(.subheadline, weight: .semibold)) - .frame(height: 50) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) + .frame(height: 48) .frame(maxWidth: .infinity) .foregroundStyle(Color.black) - .background( - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - ) - .clipShape(RoundedRectangle(cornerRadius: 16)) + .background(Color.yellow) + .clipShape(RoundedRectangle(cornerRadius: 12)) .scaleEffect(configuration.isPressed ? 0.9 : 1.0) .animation(.default, value: configuration.isPressed) } diff --git a/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift b/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift index b59b46d2..d28e6a9d 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift @@ -4,7 +4,7 @@ import SwiftUI struct ConversionSecondaryButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { configuration.label - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(height: 50) .frame(maxWidth: .infinity) .foregroundStyle(Color.black) diff --git a/Packages/PicMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift b/Packages/PicMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift index 209d3377..c985789a 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift @@ -8,9 +8,9 @@ struct HowToReceiveBenefitView: View { VStack(spacing: 24) { VStack(spacing: 8) { Text("1. Send invitation code", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) - Text("Send an invitation code to a friend who hasn't used BeMatch.", bundle: .module) + Text("Send an invitation code to a friend who hasn't used TenMatch", bundle: .module) } Image(ImageResource.line) @@ -19,9 +19,9 @@ struct HowToReceiveBenefitView: View { VStack(spacing: 8) { Text("2. \(displayDuration) free for both parties!", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) - Text("When they enter the Invitation Code and register, you will both receive BeMatch.PRO for sure!", bundle: .module) + Text("When they enter the Invitation Code and register, you will both receive TenMatch PRO for sure!", bundle: .module) } Image(ImageResource.invitationCodeSample) @@ -36,7 +36,7 @@ struct HowToReceiveBenefitView: View { .clipShape(RoundedRectangle(cornerRadius: 16)) .overlay(alignment: .top) { Text("How to Receive Benefits", bundle: .module) - .font(.system(.title2, weight: .semibold)) + .font(.system(.title2, design: .rounded, weight: .semibold)) .frame(height: 40) .padding(.horizontal, 8) .background( diff --git a/Packages/PicMatch/Sources/MembershipFeature/InvitationCampaign.swift b/Packages/PicMatch/Sources/MembershipFeature/InvitationCampaign.swift index 18937dba..2e88aae1 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/InvitationCampaign.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/InvitationCampaign.swift @@ -36,7 +36,7 @@ public struct InvitationCampaignView: View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 12) { Text("Limited to first \(viewStore.quantity) Users", bundle: .module) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) .padding(.vertical, 6) .padding(.horizontal, 8) .overlay( diff --git a/Packages/PicMatch/Sources/MembershipFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/MembershipFeature/Localizable.xcstrings index b35723b5..38561455 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/MembershipFeature/Localizable.xcstrings @@ -3,16 +3,34 @@ "strings" : { "%@ for %@" : { "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ for %2$@" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "が%2$@%1$@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@을 위해 %2$@" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "%1$@ pour %2$@" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%2$@のための%1$@" + "value" : "%1$@ za %2$@" } }, "vi" : { @@ -21,26 +39,38 @@ "value" : "%1$@ cho %2$@" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "%2$@을 위한 %1$@" + "value" : "%1$@ por %2$@" } } } }, "1. Send invitation code" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "1.招待コードを送る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "1. 초대 코드 보내기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "1. Envoyer un code d'invitation" + "value" : "1. Envoyer le code d'invitation" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "1. 招待コードを送る" + "value" : "1. Wyślij kod zaproszenia" } }, "vi" : { @@ -49,26 +79,38 @@ "value" : "1. Gửi mã mời" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "1. 초대 코드 보내기" + "value" : "1. Enviar código de invitación" } } } }, "2. %@ free for both parties!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "2.お互いに%@無料!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "2. 양측 모두 %@ 무료!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "2. %@ gratuit pour les deux parties !" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "2. お互いに%@無料!" + "value" : "2. %@ za darmo dla obu stron!" } }, "vi" : { @@ -77,26 +119,38 @@ "value" : "2. %@ miễn phí cho cả hai bên!" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "2. 양측 모두에게 %@ 무료!" + "value" : "2. ¡%@ gratis para ambas partes!" } } } }, "Find someone you care about!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "で気になる人を見つけよう!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "당신이 신경 쓰는 사람을 찾아보세요!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Trouvez quelqu'un qui vous tient à cœur !" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "で気になる人を見つけよう!" + "value" : "Znajdź kogoś, na kim ci zależy!" } }, "vi" : { @@ -105,26 +159,38 @@ "value" : "Tìm ai đó bạn quan tâm!" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "관심 있는 사람을 찾으세요!" + "value" : "¡Encuentra a alguien que te importe!" } } } }, "How to Receive Benefits" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "特典の受け取り方" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "혜택을 받는 방법" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Comment recevoir des avantages" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "特典の受け取り方" + "value" : "Jak otrzymać korzyści" } }, "vi" : { @@ -133,10 +199,10 @@ "value" : "Cách nhận lợi ích" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "혜택을 받는 방법" + "value" : "Cómo recibir beneficios" } } } @@ -149,100 +215,148 @@ "value" : "see-who-sent-it" } }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "see-who-sent-it-ja" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "see-who-sent-it-ko" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "see-who-sent-it" + "value" : "see-who-sent-it-fr" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "see-who-sent-it-ja" + "value" : "see-who-sent-it-pl" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "xem-ai-đã-gửi" + "value" : "see-who-sent-it-vi" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "누가 보냈는지 보기" + "value" : "see-who-sent-it-es" } } } }, "Invite a friend and both receive" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待した人も、された人も" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "친구를 초대하고 둘 다 받으세요" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Invitez un ami et recevez tous les deux" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "招待した人も、された人も" + "value" : "Zaproś znajomego i obaj otrzymajcie" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Mời bạn bè và cả hai đều nhận" + "value" : "Mời một người bạn và cả hai cùng nhận" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "친구를 초대하고 둘 다 받으세요" + "value" : "Invita a un amigo y ambos reciban" } } } }, "invite-ticket" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "invite-ticket-ja" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "invite-ticket-ko" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "invite-ticket-en" + "value" : "invite-ticket-fr" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "invite-ticket-ja" + "value" : "invite-ticket-pl" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "mã-mời" + "value" : "invite-ticket-vi" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "초대-티켓" + "value" : "invite-ticket-es" } } } }, "Limited to first %lld Users" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "先着%lld名限定" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "최초 %lld명의 사용자로 제한됨" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Limité aux premiers %lld utilisateurs" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "先着%lld名限定" + "value" : "Ograniczone do pierwszych %lld użytkowników" } }, "vi" : { @@ -251,82 +365,118 @@ "value" : "Giới hạn cho %lld người dùng đầu tiên" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "선착순 %lld명 한정" + "value" : "Limitado a los primeros %lld usuarios" } } } }, "Premium Plan" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "10倍楽しめるプレミアムプラン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프리미엄 플랜" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Plan Premium pour 10 fois plus de plaisir" + "value" : "Plan Premium" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "10倍楽しめるプレミアムプラン" + "value" : "Plan Premium" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Gói Premium để có nhiều niềm vui gấp 10 lần" + "value" : "Gói cao cấp" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "10배 더 즐거운 프리미엄 플랜" + "value" : "Plan Premium" } } } }, "Recurring billing. You can cancel at any time. Payment will be charged to your iTunes account and your subscription will auto-renew at %@/week until you cancel in iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "定期課金。いつでもキャンセルできます。お支払いはiTunesアカウントに請求され、iTunes Storeの設定でキャンセルするまで、購読は%@/週で自動更新されます。ロック解除をタップすると、利用規約と自動更新に同意したことになります。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "정기 결제. 언제든지 취소할 수 있습니다. 결제는 iTunes 계정으로 청구되며 iTunes Store 설정에서 취소할 때까지 구독이 %@/주로 자동 갱신됩니다. 잠금 해제를 탭하면 서비스 약관 및 자동 갱신에 동의하게 됩니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Le paiement sera facturé sur votre compte iTunes et votre abonnement se renouvellera automatiquement à %@/semaine jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Débloquer, vous acceptez les conditions d'utilisation et le renouvellement automatique." + "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Le paiement sera débité de votre compte iTunes et votre abonnement sera automatiquement renouvelé à %@/semaine jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Déverrouiller, vous acceptez les Conditions de service et le renouvellement automatique." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "定期課金。いつでもキャンセルできます。お支払いはiTunesアカウントに請求され、iTunes Storeの設定でキャンセルするまで、購読は%@/週で自動更新されます。ロック解除をタップすると、利用規約と自動更新に同意したことになります。" + "value" : "Okresowe rozliczenia. Możesz anulować w dowolnym momencie. Płatność zostanie obciążona na Twoim koncie iTunes i Twoja subskrypcja będzie automatycznie odnawiana na %@/tydzień, dopóki nie anulujesz w ustawieniach iTunes Store. Dotykając Odblokuj, zgadzasz się na Warunki korzystania z usługi i automatyczne odnawianie." } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Thanh toán định kỳ. Bạn có thể hủy bất cứ lúc nào. Thanh toán sẽ được tính vào tài khoản iTunes của bạn và đăng ký của bạn sẽ tự động gia hạn tại %@/tuần cho đến khi bạn hủy trong cài đặt iTunes Store. Bằng cách nhấn Mở khóa, bạn đồng ý với Điều khoản Dịch vụ và tự động gia hạn." + "value" : "Lập hóa đơn định kỳ. Bạn có thể hủy bất cứ lúc nào. Thanh toán sẽ được tính vào tài khoản iTunes của bạn và đăng ký của bạn sẽ tự động gia hạn ở mức %@/tuần cho đến khi bạn hủy trong cài đặt của iTunes Store. Bằng cách nhấn Mở khóa, bạn đồng ý với Điều khoản Dịch vụ và tự động gia hạn." } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "정기 결제. 언제든지 취소할 수 있습니다. 결제는 iTunes 계정으로 청구되며, iTunes Store 설정에서 취소할 때까지 구독이 %@/주에 자동 갱신됩니다. 잠금 해제를 탭하면 서비스 약관과 자동 갱신에 동의하는 것입니다." + "value" : "Facturación recurrente. Puedes cancelar en cualquier momento. El pago se cargará a tu cuenta de iTunes y tu suscripción se renovará automáticamente a %@/semana hasta que canceles en la configuración de la tienda de iTunes. Al tocar Desbloquear, aceptas los Términos de servicio y la renovación automática." } } } }, "See who sent it!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "自分をLikeした人を見れる!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "누가 보냈는지 확인하세요!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Voir qui l'a envoyé !" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "自分をLikeした人を見れる!" + "value" : "Zobacz kto to wysłał!" } }, "vi" : { @@ -335,54 +485,78 @@ "value" : "Xem ai đã gửi nó!" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "누가 보냈는지 확인하세요!" + "value" : "¡Mira quién lo envió!" } } } }, - "Send an invitation code to a friend who hasn't used BeMatch." : { + "Send an invitation code to a friend who hasn't used TenMatch" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "まだTenMatchを使っていない友達に招待コードを贈りましょう!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "아직 TenMatch을 사용하지 않은 친구에게 초대 코드를 보내세요" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Envoyez un code d'invitation à un ami qui n'a pas utilisé BeMatch." + "value" : "Envoyez un code d'invitation à un ami qui n'a pas utilisé TenMatch" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "まだBeMatch.を使っていない友達に招待コードを贈りましょう!" + "value" : "Wyślij kod zaproszenia do znajomego, który nie używał TenMatch" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Gửi mã mời cho một người bạn chưa sử dụng BeMatch." + "value" : "Gửi mã mời đến một người bạn chưa sử dụng TenMatch" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch를 사용하지 않은 친구에게 초대 코드를 보내세요." + "value" : "Envía un código de invitación a un amigo que no ha usado TenMatch" } } } }, "Send Invitation Code" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待コードを送る" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초대 코드 보내기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Envoyer un code d'invitation" + "value" : "Envoyer le code d'invitation" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "招待コードを送る" + "value" : "Wyślij kod zaproszenia" } }, "vi" : { @@ -391,26 +565,38 @@ "value" : "Gửi mã mời" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "초대 코드 보내기" + "value" : "Enviar código de invitación" } } } }, "Special offer" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "️うれしい特典" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "특별 제공" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Offre spéciale" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "うれしい特典" + "value" : "Specjalna oferta" } }, "vi" : { @@ -419,122 +605,170 @@ "value" : "Ưu đãi đặc biệt" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "특별 제공" + "value" : "Oferta especial" } } } }, "Upgrade for %@/week" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "続ける - %@/週" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "업그레이드 - %@/주" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Mise à niveau pour %@/semaine" + "value" : "Mettre à niveau pour %@/semaine" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "続ける - %@/週" + "value" : "Uaktualnij za %@/tydzień" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Nâng cấp với %@/tuần" + "value" : "Nâng cấp cho %@/tuần" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "업그레이드 - %@/주" + "value" : "Actualizar por %@/semana" } } } }, - "When they enter the Invitation Code and register, you will both receive BeMatch.PRO for sure!" : { + "When they enter the Invitation Code and register, you will both receive TenMatch PRO for sure!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "相手が招待コードを入力して登録すると、お互いにTenMatch PROを必ずプレゼント!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상대가 초대 코드를 입력하고 등록하면, 둘 다 TenMatch PRO를 받을 수 있습니다!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Lorsqu'ils saisissent le code d'invitation et s'inscrivent, vous recevrez tous les deux BeMatch.PRO !" + "value" : "Lorsqu'ils saisissent le code d'invitation et s'inscrivent, vous recevrez tous les deux TenMatch PRO pour sûr !" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "相手が招待コードを入力して登録すると、お互いにBeMatch.PROを必ずプレゼント!" + "value" : "Kiedy wprowadzą kod zaproszenia i zarejestrują się, obaj otrzymacie TenMatch PRO na pewno!" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Khi họ nhập Mã mời và đăng ký, cả hai bạn chắc chắn sẽ nhận được BeMatch.PRO!" + "value" : "Khi họ nhập mã mời và đăng ký, cả hai bạn sẽ nhận được TenMatch PRO chắc chắn!" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "초대 코드를 입력하고 등록하면 두 사람 모두 BeMatch.PRO를 받을 수 있습니다!" + "value" : "¡Cuando ingresen el código de invitación y se registren, ambos recibirán TenMatch PRO seguro!" } } } }, "when they use your invitation code you get" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "友達があなたの招待コードを\n入力すると、お互いに" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "그들이 당신의 초대 코드를 사용하면 당신은" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "lorsqu'ils utilisent votre code d'invitation, vous obtenez" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "友達があなたの招待コードを\n入力すると、お互いに" + "value" : "kiedy używają twojego kodu zaproszenia, otrzymujesz" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "khi họ sử dụng mã mời của bạn, bạn sẽ nhận được" + "value" : "khi họ sử dụng mã mời của bạn, bạn nhận được" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "친구가 초대 코드를 입력하면" + "value" : "cuando usan tu código de invitación, obtienes" } } } }, "worth benefits" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "の特典がお互いにもらえる!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상당한 혜택" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "des avantages d'une valeur de" + "value" : "d'avantages" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "の特典がお互いにもらえる!" + "value" : "korzyści warte" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "những lợi ích có giá trị" + "value" : "những lợi ích đáng giá" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "가치 있는 혜택을 받을 수 있습니다!" + "value" : "beneficios por valor de" } } } diff --git a/Packages/PicMatch/Sources/MembershipFeature/Membership.swift b/Packages/PicMatch/Sources/MembershipFeature/Membership.swift index ab0c36b9..9a5b15ba 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/Membership.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/Membership.swift @@ -42,7 +42,11 @@ public struct MembershipView: View { store.send(.closeButtonTapped) } label: { Image(systemName: "xmark") + .font(.system(size: 12, weight: .regular)) + .frame(width: 32, height: 32) .foregroundStyle(Color.primary) + .background(Color(uiColor: UIColor.quaternarySystemFill)) + .clipShape(Circle()) } } } diff --git a/Packages/PicMatch/Sources/MembershipFeature/MembershipPurchase.swift b/Packages/PicMatch/Sources/MembershipFeature/MembershipPurchase.swift index 4ff9cee5..75ea3041 100644 --- a/Packages/PicMatch/Sources/MembershipFeature/MembershipPurchase.swift +++ b/Packages/PicMatch/Sources/MembershipFeature/MembershipPurchase.swift @@ -43,8 +43,17 @@ public struct MembershipPurchaseView: View { .stroke(Color.white, lineWidth: 1) ) - Text("Find someone you care about!", bundle: .module) - .font(.system(.title2, weight: .bold)) + VStack(spacing: 24) { + Text("Find someone you care about!", bundle: .module) + .font(.system(.title2, weight: .bold)) + + Button { + store.send(.upgradeButtonTapped) + } label: { + Text("Upgrade for \(viewStore.displayPrice)/week", bundle: .module) + } + .buttonStyle(ConversionPrimaryButtonStyle()) + } SpecialOfferView() diff --git a/Packages/PicMatch/Sources/MembershipStatusFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/MembershipStatusFeature/Localizable.xcstrings index 687616d2..adfd9817 100644 --- a/Packages/PicMatch/Sources/MembershipStatusFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/MembershipStatusFeature/Localizable.xcstrings @@ -1,43 +1,67 @@ { "sourceLanguage" : "en", "strings" : { - "About BeMatch PRO" : { + "About TenMatch PRO" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PROについて" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PRO에 대하여" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "À propos de BeMatch PRO" + "value" : "À propos de TenMatch PRO" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PROについて" + "value" : "O TenMatch PRO" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Về BeMatch PRO" + "value" : "Về TenMatch PRO" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO에 대해" + "value" : "Acerca de TenMatch PRO" } } } }, "App Store" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Store" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "App Store" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "App Store" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", "value" : "App Store" @@ -49,7 +73,7 @@ "value" : "App Store" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", "value" : "App Store" @@ -57,74 +81,110 @@ } } }, - "BeMatch PRO" : { + "TenMatch PRO" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PRO" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PRO" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO" + "value" : "TenMatch PRO" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO" + "value" : "TenMatch PRO" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO" + "value" : "TenMatch PRO" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO" + "value" : "TenMatch PRO" } } } }, "Cancellation" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PROの解約" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch PRO의 취소" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Annulation de BeMatch PRO" + "value" : "Annulation de TenMatch PRO" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PROの解約" + "value" : "Anulowanie TenMatch PRO" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Hủy BeMatch PRO" + "value" : "Hủy TenMatch PRO" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch PRO 취소" + "value" : "Cancelación de TenMatch PRO" } } } }, "Expiration date" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "有効期限" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "만료 날짜" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Date d'expiration" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "有効期限" + "value" : "Data wygaśnięcia" } }, "vi" : { @@ -133,26 +193,38 @@ "value" : "Ngày hết hạn" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "만료일" + "value" : "Fecha de vencimiento" } } } }, "FREE" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "無料会員" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "무료 회원" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "GRATUIT" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "無料会員" + "value" : "DARMOWY" } }, "vi" : { @@ -161,26 +233,38 @@ "value" : "MIỄN PHÍ" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "무료 회원" + "value" : "GRATIS" } } } }, "Invitation Campaigns" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "招待キャンペーン" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "초대 캠페인" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Campagnes d'invitation" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "招待キャンペーン" + "value" : "Kampanie zaproszeniowe" } }, "vi" : { @@ -189,54 +273,78 @@ "value" : "Chiến dịch mời" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "초대 캠페인" + "value" : "Campañas de invitación" } } } }, "Membership Status" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "会員ステータス" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "회원 상태" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Statut d'adhésion" + "value" : "Statut de membre" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "会員ステータス" + "value" : "Status członkostwa" } }, "vi" : { "stringUnit" : { "state" : "translated", - "value" : "Trạng thái thành viên" + "value" : "Tình trạng thành viên" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "회원 상태" + "value" : "Estado de membresía" } } } }, "Payment Method" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "支払い方法" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "결제 방법" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Méthode de paiement" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "支払い方法" + "value" : "Metoda płatności" } }, "vi" : { @@ -245,26 +353,38 @@ "value" : "Phương thức thanh toán" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "결제 방법" + "value" : "Método de pago" } } } }, "Status" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ステータス" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "상태" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Statut" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ステータス" + "value" : "Status" } }, "vi" : { @@ -273,26 +393,38 @@ "value" : "Trạng thái" } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "상태" + "value" : "Estado" } } } }, "The subscription will be automatically cancelled upon expiration." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "有効期限を迎えると自動的に解約されます。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "구독은 만료 시 자동으로 취소됩니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "L'abonnement sera automatiquement annulé à l'expiration." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "有効期限を迎えると自動的に解約されます。" + "value" : "Subskrypcja zostanie automatycznie anulowana po wygaśnięciu." } }, "vi" : { @@ -301,10 +433,10 @@ "value" : "Đăng ký sẽ tự động bị hủy khi hết hạn." } }, - "ko" : { + "es" : { "stringUnit" : { "state" : "translated", - "value" : "구독은 만료 시 자동으로 취소됩니다." + "value" : "La suscripción se cancelará automáticamente al vencimiento." } } } @@ -312,4 +444,3 @@ }, "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift index 6164ed1c..495b192a 100644 --- a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift +++ b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift @@ -14,7 +14,7 @@ public struct MembershipStatusCampaignContentView: View { List { Section { LabeledContent { - Text("BeMatch PRO", bundle: .module) + Text("TenMatch PRO", bundle: .module) } label: { Text("Status", bundle: .module) } diff --git a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift index 9b7fd58d..c0624694 100644 --- a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift +++ b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift @@ -28,7 +28,7 @@ public struct MembershipStatusFreeContentView: View { LabeledContent { Image(systemName: "chevron.right") } label: { - Text("About BeMatch PRO", bundle: .module) + Text("About TenMatch PRO", bundle: .module) .foregroundStyle(Color.primary) } } diff --git a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift index 38369067..1e2acbb3 100644 --- a/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift +++ b/Packages/PicMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift @@ -14,7 +14,7 @@ public struct MembershipStatusPaidContentView: View { List { Section { LabeledContent { - Text("BeMatch PRO", bundle: .module) + Text("TenMatch PRO", bundle: .module) } label: { Text("Status", bundle: .module) } diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/Contents.json deleted file mode 100644 index 191ee0a6..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "category-active.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/category-active.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/category-active.pdf deleted file mode 100644 index ad6b78f7..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-active.imageset/category-active.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/Contents.json deleted file mode 100644 index 56b2c730..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "category-deactive.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/category-deactive.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/category-deactive.pdf deleted file mode 100644 index 32f49456..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/category-deactive.imageset/category-deactive.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/Contents.json rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/Contents.json diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/recommendation-active.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/recommendation-active.pdf similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/recommendation-active.pdf rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-active.imageset/recommendation-active.pdf diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Card.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Card.pdf similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Card.pdf rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Card.pdf diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Contents.json rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/explorer-deactive.imageset/Contents.json diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf index 4fc9f158..4d033c0f 100644 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf and b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf differ diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Chat.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Chat.pdf similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Chat.pdf rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Chat.pdf diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json index 79dbff64..8941a633 100644 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json +++ b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "message-deactive.pdf", + "filename" : "Chat.pdf", "idiom" : "universal" } ], diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/message-deactive.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/message-deactive.pdf deleted file mode 100644 index caf02732..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/message-deactive.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/Contents.json rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/Contents.json diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/explorer-active.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/explorer-active.pdf similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/explorer-active.pdf rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-active.imageset/explorer-active.pdf diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Contents.json rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Contents.json diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Search.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Search.pdf similarity index 100% rename from Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Search.pdf rename to Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/recommendation-deactive.imageset/Search.pdf diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/Contents.json deleted file mode 100644 index 7aa984fd..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "search.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/search.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/search.pdf deleted file mode 100644 index 69488cb6..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-active.imageset/search.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/Contents.json deleted file mode 100644 index 82dc02d3..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "search-deactive.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/search-deactive.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/search-deactive.pdf deleted file mode 100644 index ba0ab603..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/search-deactive.imageset/search-deactive.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/Contents.json deleted file mode 100644 index 0f8f8775..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "star-active.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/star-active.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/star-active.pdf deleted file mode 100644 index 7dfa0503..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-active.imageset/star-active.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/Contents.json b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/Contents.json deleted file mode 100644 index 8eebcd12..00000000 --- a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "star.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/star.pdf b/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/star.pdf deleted file mode 100644 index a9498bde..00000000 Binary files a/Packages/PicMatch/Sources/NavigationFeature/Assets.xcassets/star-deactive.imageset/star.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/NavigationFeature/RootNavigation.swift b/Packages/PicMatch/Sources/NavigationFeature/RootNavigation.swift index ea576b36..380dedae 100644 --- a/Packages/PicMatch/Sources/NavigationFeature/RootNavigation.swift +++ b/Packages/PicMatch/Sources/NavigationFeature/RootNavigation.swift @@ -1,6 +1,6 @@ +import CategoryFeature import ComposableArchitecture import DirectMessageTabFeature -import ExplorerFeature import NavigationLogic import RecommendationFeature import SwiftUI @@ -22,21 +22,21 @@ public struct RootNavigationView: View { .tabItem { Image( viewStore.tab.is(\.recommendation) - ? ImageResource.searchActive - : ImageResource.searchDeactive + ? ImageResource.recommendationActive + : ImageResource.recommendationDeactive ) .resizable() .aspectRatio(contentMode: .fit) .frame(width: 30, height: 30) } - ExplorerView(store: store.scope(state: \.explorer, action: \.explorer)) - .tag(RootNavigationLogic.Tab.explorer) + CategoryView(store: store.scope(state: \.category, action: \.category)) + .tag(RootNavigationLogic.Tab.category) .tabItem { Image( - viewStore.tab.is(\.explorer) - ? ImageResource.categoryActive - : ImageResource.categoryDeactive + viewStore.tab.is(\.category) + ? ImageResource.explorerActive + : ImageResource.explorerDeactive ) .resizable() .aspectRatio(contentMode: .fit) diff --git a/Packages/PicMatch/Sources/NetworkErrorFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/NetworkErrorFeature/Localizable.xcstrings index 46f361b3..010c82e8 100644 --- a/Packages/PicMatch/Sources/NetworkErrorFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/NetworkErrorFeature/Localizable.xcstrings @@ -1,63 +1,86 @@ { - "sourceLanguage": "en", - "strings": { - "NETWORK ERROR": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "ネットワークエラー" + "sourceLanguage" : "en", + "strings" : { + "NETWORK ERROR" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ネットワークエラー" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "ERREUR RÉSEAU" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "네트워크 오류" } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "LỖI MẠNG" + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "ERREUR RÉSEAU" } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "네트워크 오류" + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "BŁĄD SIECI" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "LỖI MẠNG" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "ERROR DE RED" } } } }, - "Servers are crowded. Please try restarting the application after a while.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "サーバーが混み合っています。しばらくしてからアプリの再起動をお試しください。" + "Servers are crowded. Please try restarting the application after a while." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サーバーが混み合っています。しばらくしてからアプリの再起動をお試しください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "서버가 혼잡합니다. 잠시 후에 애플리케이션을 다시 시작해보세요." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les serveurs sont surchargés. Veuillez essayer de redémarrer l'application après un certain temps." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Les serveurs sont saturés. Veuillez réessayer de redémarrer l'application après un certain temps." + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serwery są przeciążone. Spróbuj ponownie uruchomić aplikację za chwilę." } }, - "vi": { - "stringUnit": { - "state": "translated", - "value": "Máy chủ đang quá tải. Vui lòng thử khởi động lại ứng dụng sau một thời gian." + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Máy chủ đang quá tải. Vui lòng thử khởi động lại ứng dụng sau một thời gian." } }, - "ko": { - "stringUnit": { - "state": "translated", - "value": "서버가 혼잡합니다. 잠시 후 애플리케이션을 다시 시작해 주세요." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Los servidores están congestionados. Por favor, intenta reiniciar la aplicación después de un rato." } } } } }, - "version": "1.0" + "version" : "1.0" } - diff --git a/Packages/PicMatch/Sources/NetworkErrorFeature/NetworkError.swift b/Packages/PicMatch/Sources/NetworkErrorFeature/NetworkError.swift index 778aa4b5..fc310671 100644 --- a/Packages/PicMatch/Sources/NetworkErrorFeature/NetworkError.swift +++ b/Packages/PicMatch/Sources/NetworkErrorFeature/NetworkError.swift @@ -13,10 +13,10 @@ public struct NetworkErrorView: View { WithViewStore(store, observe: { $0 }) { _ in VStack(spacing: 24) { Text("NETWORK ERROR", bundle: .module) - .font(.system(.headline, weight: .semibold)) + .font(.system(.headline, design: .rounded, weight: .semibold)) Text("Servers are crowded. Please try restarting the application after a while.", bundle: .module) - .font(.system(.body, weight: .semibold)) + .font(.system(.body, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) } .padding(.horizontal, 16) diff --git a/Packages/PicMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings index 9bbefbb4..7c324205 100644 --- a/Packages/PicMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings @@ -1,38 +1,86 @@ { - "sourceLanguage": "en", - "strings": { - "Activate": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "有効にする" + "sourceLanguage" : "en", + "strings" : { + "Activate" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "有効にする" } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Activer" + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "활성화" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktywuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kích hoạt" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activar" } } } }, - "You'll need to enable notifications to notice when you have a match.": { - "localizations": { - "ja": { - "stringUnit": { - "state": "translated", - "value": "マッチした時に気づくために通知を有効にしてね。" + "You'll need to enable notifications to notice when you have a match." : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マッチした時に気づくために通知を有効にしてね。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "매치가 되면 알림을 활성화해야 합니다." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vous devrez activer les notifications pour remarquer lorsque vous avez un match." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Musisz włączyć powiadomienia, aby zauważyć, kiedy masz dopasowanie." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạn cần bật thông báo để biết khi nào bạn có một kết quả phù hợp." } }, - "fr": { - "stringUnit": { - "state": "translated", - "value": "Vous devrez activer les notifications pour remarquer quand vous avez une correspondance." + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Necesitarás habilitar las notificaciones para notar cuándo tienes una coincidencia." } } } } }, - "version": "1.0" + "version" : "1.0" } diff --git a/Packages/PicMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift b/Packages/PicMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift index 6bbc1d7d..2a6fbc2a 100644 --- a/Packages/PicMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift +++ b/Packages/PicMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift @@ -15,11 +15,11 @@ public struct NotificationsReEnableView: View { .font(.system(size: 20, weight: .regular)) Text("You'll need to enable notifications to notice when you have a match.", bundle: .module) - .font(.system(.caption, weight: .semibold)) + .font(.system(.caption, design: .rounded, weight: .semibold)) .frame(maxWidth: .infinity, alignment: .leading) Text("Activate", bundle: .module) - .font(.system(.caption2, weight: .semibold)) + .font(.system(.caption2, design: .rounded, weight: .semibold)) .padding(.vertical, 12) .padding(.horizontal, 28) .foregroundStyle(Color.black) diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/Contents.json deleted file mode 100644 index 05d14c07..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "boy.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/boy.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/boy.svg deleted file mode 100644 index 2a07141d..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/boy.imageset/boy.svg +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/Contents.json deleted file mode 100644 index 5812db1c..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "empty-picture.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/empty-picture.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/empty-picture.svg deleted file mode 100644 index 38d6b265..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/empty-picture.imageset/empty-picture.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/Contents.json deleted file mode 100644 index 47f28ee1..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "girl.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/girl.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/girl.svg deleted file mode 100644 index 68dde438..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/girl.imageset/girl.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/Contents.json deleted file mode 100644 index 428cfe45..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "god.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/god.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/god.svg deleted file mode 100644 index 0e20cbf6..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/god-icon-white.imageset/god.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/Contents.json deleted file mode 100644 index 221b35c7..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "instagram.png", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/instagram.png b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/instagram.png deleted file mode 100644 index 98bda02e..00000000 Binary files a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/instagram.imageset/instagram.png and /dev/null differ diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/Contents.json deleted file mode 100644 index 705b3ec7..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "line.png", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/line.png b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/line.png deleted file mode 100644 index a0eefc03..00000000 Binary files a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/line.imageset/line.png and /dev/null differ diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/Contents.json deleted file mode 100644 index e5656845..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "other.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/other.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/other.svg deleted file mode 100644 index 701aa803..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/other.imageset/other.svg +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/Contents.json deleted file mode 100644 index 2bd7c4f1..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "restroom.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/restroom.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/restroom.svg deleted file mode 100644 index e19de972..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/restroom.imageset/restroom.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/Contents.json b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/Contents.json deleted file mode 100644 index 7b2694a9..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "see-no-evil-monkey.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/see-no-evil-monkey.svg b/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/see-no-evil-monkey.svg deleted file mode 100644 index f76afd5e..00000000 --- a/Packages/PicMatch/Sources/OnboardFeature/Assets.xcassets/see-no-evil-monkey.imageset/see-no-evil-monkey.svg +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/OnboardFeature/Onboard.swift b/Packages/PicMatch/Sources/OnboardFeature/Onboard.swift index 2733a7a0..417cd3fc 100644 --- a/Packages/PicMatch/Sources/OnboardFeature/Onboard.swift +++ b/Packages/PicMatch/Sources/OnboardFeature/Onboard.swift @@ -17,10 +17,7 @@ public struct OnboardView: View { public var body: some View { NavigationStackStore(store.scope(state: \.path, action: \.path)) { - UsernameSettingView( - store: store.scope(state: \.username, action: \.username), - nextButtonStyle: .next - ) + UsernameSettingView(store: store.scope(state: \.username, action: \.username)) } destination: { store in switch store { case .gender: diff --git a/Packages/PicMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf b/Packages/PicMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf index d4c150ed..9fa265c5 100644 Binary files a/Packages/PicMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf and b/Packages/PicMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf differ diff --git a/Packages/PicMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings index aa11f980..16394ed2 100644 --- a/Packages/PicMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings @@ -3,6 +3,12 @@ "strings" : { "Continue" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -14,11 +20,35 @@ "state" : "translated", "value" : "続ける" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } } } }, "most popular" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "más popular" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -30,11 +60,35 @@ "state" : "translated", "value" : "いちばん人気" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가장 인기 있는" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "najbardziej popularny" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "phổ biến nhất" + } } } }, "Premium Plan" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plan Premium" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -46,15 +100,39 @@ "state" : "translated", "value" : "10倍楽しめるプレミアムプラン" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프리미엄 플랜" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Plan Premium" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gói cao cấp" + } } } }, "Recurring billing. You can cancel at any time. Your payment will be charged to your iTunes account and will auto-renew until you cancel in the iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal." : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Facturación recurrente. Puedes cancelar en cualquier momento. Su pago se cargará a su cuenta de iTunes y se renovará automáticamente hasta que cancele en la configuración de la tienda de iTunes. Al tocar Desbloquear, acepta los Términos de servicio y la renovación automática." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Votre paiement sera débité de votre compte iTunes et sera renouvelé automatiquement jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Débloquer, vous acceptez les conditions d'utilisation et le renouvellement automatique." + "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Votre paiement sera débité de votre compte iTunes et sera renouvelé automatiquement jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Déverrouiller, vous acceptez les Conditions d'utilisation et le renouvellement automatique." } }, "ja" : { @@ -62,27 +140,38 @@ "state" : "translated", "value" : "定期課金。いつでもキャンセルできます。お支払いはiTunesアカウントに請求され、iTunes Storeの設定でキャンセルするまで、自動更新されます。ロック解除をタップすると、利用規約と自動更新に同意したことになります。" } - } - } - }, - "Restore a purchase" : { - "localizations" : { - "fr" : { + }, + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Restaurer un achat" + "value" : "정기 결제. 언제든지 취소할 수 있습니다. 결제는 iTunes 계정으로 청구되며 iTunes 스토어 설정에서 취소할 때까지 자동 갱신됩니다. 잠금을 해제하면 서비스 약관 및 자동 갱신에 동의하게 됩니다." } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Okresowe rozliczenia. Możesz anulować w dowolnym momencie. Twoja płatność zostanie obciążona na Twoim koncie iTunes i będzie automatycznie odnawiana, dopóki nie anulujesz w ustawieniach sklepu iTunes Store. Dotykając Odblokuj, zgadzasz się na Warunki korzystania z usługi i automatyczne odnawianie." + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "購入を復元する" + "value" : "Lập hóa đơn định kỳ. Bạn có thể hủy bất cứ lúc nào. Thanh toán của bạn sẽ được tính vào tài khoản iTunes của bạn và sẽ tự động gia hạn cho đến khi bạn hủy trong cài đặt của iTunes Store. Bằng cách nhấn Mở khóa, bạn đồng ý với Điều khoản dịch vụ và tự động gia hạn." } } } + }, + "Restore a purchase" : { + }, "See who likes you" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ver quién te gusta" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -94,9 +183,27 @@ "state" : "translated", "value" : "自分をLikeした人を見れる!" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "당신을 좋아하는 사람을 확인하세요" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zobacz, kto cię lubi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xem ai thích bạn" + } } } } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift b/Packages/PicMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift index c06511fd..57b5bf72 100644 --- a/Packages/PicMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift +++ b/Packages/PicMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift @@ -18,7 +18,7 @@ public struct ProductPurchaseContentView: View { .frame(width: 190, height: 190) .clipShape(Circle()) .offset(y: -190) - .blur(radius: 128) + .blur(radius: 64) VStack(spacing: 0) { ScrollView(.vertical) { diff --git a/Packages/PicMatch/Sources/ProfileEditFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ProfileEditFeature/Localizable.xcstrings index e32f1028..276b2654 100644 --- a/Packages/PicMatch/Sources/ProfileEditFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ProfileEditFeature/Localizable.xcstrings @@ -3,6 +3,12 @@ "strings" : { "Approved" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aprobado" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -14,12 +20,36 @@ "state" : "translated", "value" : "承認済み" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "승인됨" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zatwierdzone" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã phê duyệt" + } } } }, "Edit Profile" : { "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Editar perfil" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -31,12 +61,36 @@ "state" : "translated", "value" : "プロフィール編集" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로필 수정" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Edytuj profil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chỉnh sửa hồ sơ" + } } } }, "Gender" : { "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Género" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -48,11 +102,35 @@ "state" : "translated", "value" : "性別" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "성별" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Płeć" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Giới tính" + } } } }, "In Review" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "En revisión" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -64,11 +142,35 @@ "state" : "translated", "value" : "審査中" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "검토 중" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "W recenzji" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đang xem xét" + } } } }, "Nick Name" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apodo" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -80,11 +182,35 @@ "state" : "translated", "value" : "ニックネーム" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "닉네임" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pseudonim" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Biệt danh" + } } } }, "No Set" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No establecido" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -96,12 +222,36 @@ "state" : "translated", "value" : "未設定" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "설정 안 됨" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie ustawione" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chưa đặt" + } } } }, "PROFILE" : { "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "PERFIL" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -113,12 +263,36 @@ "state" : "translated", "value" : "プロフィール" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로필" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "PROFIL" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "HỒ SƠ" + } } } }, "Profile Image" : { "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Imagen de perfil" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -130,11 +304,35 @@ "state" : "translated", "value" : "プロフィール画像" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로필 이미지" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zdjęcie profilowe" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ảnh hồ sơ" + } } } }, "Profile Picture" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Foto de perfil" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -146,11 +344,35 @@ "state" : "translated", "value" : "プロフィール画像" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "프로필 사진" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zdjęcie profilowe" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ảnh đại diện" + } } } }, "Rejected" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rechazado" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -162,11 +384,35 @@ "state" : "translated", "value" : "却下済み" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "거절됨" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odrzucone" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Đã từ chối" + } } } }, "Short Comment" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comentario breve" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -178,12 +424,46 @@ "state" : "translated", "value" : "ひとこと" } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "짧은 댓글" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Krótki komentarz" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bình luận ngắn" + } + } + } + }, + "tenten PIN" : { + "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenのPIN" + } } } }, "Username" : { "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nombre de usuario" + } + }, "fr" : { "stringUnit" : { "state" : "translated", @@ -195,25 +475,27 @@ "state" : "translated", "value" : "ユーザーネーム" } - } - } - }, - "Username on BeReal." : { - "localizations" : { - "fr" : { + }, + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Nom d'utilisateur sur BeReal." + "value" : "사용자 이름" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nazwa użytkownika" + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealのユーザーネーム" + "value" : "Tên người dùng" } } } } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/ProfileEditFeature/ProfileEdit.swift b/Packages/PicMatch/Sources/ProfileEditFeature/ProfileEdit.swift index e2b5bc89..6f5207a2 100644 --- a/Packages/PicMatch/Sources/ProfileEditFeature/ProfileEdit.swift +++ b/Packages/PicMatch/Sources/ProfileEditFeature/ProfileEdit.swift @@ -25,7 +25,7 @@ public struct ProfileEditView: View { LabeledContent { Image(systemName: "chevron.right") } label: { - Text("Username on BeReal.", bundle: .module) + Text("tenten PIN", bundle: .module) .foregroundStyle(Color.primary) } } @@ -117,10 +117,9 @@ public struct ProfileEditView: View { store: store.scope( state: \.$destination.usernameSetting, action: \.destination.usernameSetting - ) - ) { store in - UsernameSettingView(store: store, nextButtonStyle: .save) - } + ), + destination: UsernameSettingView.init(store:) + ) .navigationDestination( store: store.scope( state: \.$destination.pictureSetting, diff --git a/Packages/PicMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings index a1561359..7e84ce76 100644 --- a/Packages/PicMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings @@ -1,34 +1,82 @@ { "sourceLanguage" : "en", "strings" : { - "Add BeReal" : { + "Add tenten" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenを追加する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "로켓 추가" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Ajouter BeReal" + "value" : "Ajouter un tenten" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dodaj tenten" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thêm tenten" + } + }, + "es" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealを追加する" + "value" : "Agregar tenten" } } } }, "Block" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブロックする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "차단" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Bloquer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ブロックする" + "value" : "Blokuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chặn" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bloquear" } } } @@ -36,16 +84,40 @@ "Cancel" : { "extractionState" : "manual", "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "キャンセル" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "취소" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Annuler" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "キャンセル" + "value" : "Anuluj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hủy bỏ" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cancelar" } } } @@ -53,64 +125,160 @@ "I confirmed transmission" : { "extractionState" : "manual", "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "確認して送信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "전송 확인" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Transmission confirmée" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "確認して送信" + "value" : "Potwierdzenie wysłania" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tôi đã xác nhận truyền tải" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Transmisión confirmada" } } } }, "Message" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "メッセージ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "메시지" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Message" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "メッセージ" + "value" : "Wiadomość" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tin nhắn" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Mensaje" } } } }, "Report" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通報" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "신고" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Signaler" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "通報" + "value" : "Zgłoś" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Báo cáo" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reportar" } } } }, "Unmatch" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "マッチを解除" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "언매치" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Retirer la correspondance" + "value" : "Annuler la correspondance" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "マッチを解除" + "value" : "Usuń dopasowanie" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hủy ghép đôi" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desemparejar" } } } diff --git a/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift b/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift index 5b36d210..cc794eef 100644 --- a/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift +++ b/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift @@ -63,7 +63,7 @@ public struct ProfileExplorerView: View { } label: { Text(viewStore.displayName) .foregroundStyle(Color.primary) - .font(.system(.callout, weight: .semibold)) + .font(.system(.callout, design: .rounded, weight: .semibold)) } } diff --git a/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift b/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift index d0f36f4d..77cdaa29 100644 --- a/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift +++ b/Packages/PicMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift @@ -16,13 +16,11 @@ public struct ProfileExplorerPreviewContentView: View { PictureSliderView(store: store.scope(state: \.pictureSlider, action: \.pictureSlider)) PrimaryButton( - String(localized: "Add BeReal", bundle: .module) + String(localized: "Add tenten", bundle: .module) ) { store.send(.addExternalProductButtonTapped) } .padding(.horizontal, 16) - - Spacer() } .confirmationDialog(store: store.scope(state: \.$confirmationDialog, action: \.confirmationDialog)) } diff --git a/Packages/PicMatch/Sources/ProfileFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ProfileFeature/Localizable.xcstrings index e301e31f..0ecba151 100644 --- a/Packages/PicMatch/Sources/ProfileFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ProfileFeature/Localizable.xcstrings @@ -3,13 +3,37 @@ "strings" : { "🔗 %@" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "🔗 %@" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "🔗 %@" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "🔗 %@" } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "🔗 %@" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "🔗 %@" + } + }, + "es" : { "stringUnit" : { "state" : "translated", "value" : "🔗 %@" @@ -19,4 +43,4 @@ } }, "version" : "1.0" -} \ No newline at end of file +} diff --git a/Packages/PicMatch/Sources/ProfileFeature/Profile.swift b/Packages/PicMatch/Sources/ProfileFeature/Profile.swift index bb692e2b..ceeaea64 100644 --- a/Packages/PicMatch/Sources/ProfileFeature/Profile.swift +++ b/Packages/PicMatch/Sources/ProfileFeature/Profile.swift @@ -8,6 +8,7 @@ public struct ProfileView: View { @State var translation: CGSize = .zero @State var scaleEffect: Double = 1.0 let store: StoreOf + let width = UIScreen.main.bounds.width public init(store: StoreOf) { self.store = store @@ -16,7 +17,7 @@ public struct ProfileView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack { - VStack(spacing: 24) { + VStack(spacing: 56) { HStack(spacing: 0) { Button { store.send(.closeButtonTapped) @@ -30,11 +31,11 @@ public struct ProfileView: View { if let displayName = viewStore.currentUser?.displayName { Text(displayName) .foregroundStyle(Color.white) - .font(.system(.callout, weight: .semibold)) + .font(.system(.callout, design: .rounded, weight: .semibold)) } else if let username = viewStore.currentUser?.berealUsername { Text(username) .foregroundStyle(Color.white) - .font(.system(.callout, weight: .semibold)) + .font(.system(.callout, design: .rounded, weight: .semibold)) } Spacer() Spacer() @@ -43,29 +44,32 @@ public struct ProfileView: View { .padding(.top, 56) .padding(.horizontal, 16) - IfLetStore( - store.scope(state: \.pictureSlider, action: \.pictureSlider), - then: PictureSliderView.init(store:), - else: { - Color.black - .aspectRatio(3 / 4, contentMode: .fill) - .frame(width: UIScreen.main.bounds.width) - } - ) + VStack(spacing: 16) { + IfLetStore( + store.scope(state: \.pictureSlider, action: \.pictureSlider), + then: PictureSliderView.init(store:), + else: { + Color.black + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) + } + ) - if let url = viewStore.currentUser?.externalProductUrl { - Button { - store.send(.jumpExternalProductButtonTapped) - } label: { - Text("🔗 \(url)") - .font(.system(.caption)) - .foregroundStyle(Color.primary) + if let url = viewStore.currentUser?.externalProductUrl { + Button { + store.send(.jumpExternalProductButtonTapped) + } label: { + Text("🔗 \(url)") + .font(.system(.caption)) + .foregroundStyle(Color.primary) + } } } + Spacer() } .background(Color.black) - .cornerRadius(40) + .cornerRadius(16) .scaleEffect(scaleEffect) .ignoresSafeArea() } @@ -104,7 +108,7 @@ public struct ProfileView: View { store: store.scope(state: \.$destination.editUsername, action: \.destination.editUsername) ) { childStore in NavigationStack { - UsernameSettingView(store: childStore, nextButtonStyle: .save) + UsernameSettingView(store: childStore) .toolbar { ToolbarItem(placement: .topBarLeading) { Button { diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings index 06dfbc16..6a448f99 100644 --- a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings @@ -1,119 +1,167 @@ { "sourceLanguage" : "en", "strings" : { - "Next" : { + "Continue" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Suivant" + "value" : "Continuer" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "つぎへ" + "value" : "続ける" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Tiếp theo" + "value" : "계속" } }, - "ko" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "다음" + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" } } } }, - "Save" : { - "extractionState" : "manual", + "It will be public 🌎" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Será público 🌎" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Enregistrer" + "value" : "Ce sera public 🌎" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "保存する" + "value" : "公開されます🌎" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Lưu" + "value" : "공개됩니다 🌎" } }, - "ko" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "저장" + "value" : "Będzie publiczne 🌎" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nó sẽ được công khai 🌎" } } } }, - "Select a photo saved with BeReal." : { + "Save" : { + "extractionState" : "manual", "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guardar" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Sélectionnez une photo enregistrée avec BeReal." + "value" : "Enregistrer" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealで保存した写真を選択してください" + "value" : "保存する" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Chọn một bức ảnh đã lưu bằng BeReal." + "value" : "저장" } }, - "ko" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapisz" + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeReal로 저장한 사진을 선택하세요." + "value" : "Lưu" } } } }, - "Set your saved photo to your profile (it will be public 🌏)" : { + "Set your profile pic." : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Establece tu foto de perfil." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Définissez votre photo enregistrée sur votre profil (elle sera publique 🌏)" + "value" : "Définissez votre photo de profil." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealで保存した写真を3枚プロフィールに設定しよう(公開されるよ 🌏)" + "value" : "プロフィール写真を設定してください。" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Đặt ảnh đã lưu của bạn làm ảnh hồ sơ (sẽ được công khai 🌏)" + "value" : "프로필 사진을 설정하세요." } }, - "ko" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ustaw swoje zdjęcie profilowe." + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "저장된 사진을 프로필로 설정하세요 (공개됩니다 🌏)" + "value" : "Đặt ảnh hồ sơ của bạn." } } } } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift index 55bbdaad..3e1a7509 100644 --- a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift +++ b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift @@ -17,10 +17,6 @@ public struct PhotoGrid: View { .aspectRatio(3 / 4, contentMode: .fill) .clipped() .clipShape(RoundedRectangle(cornerRadius: 10)) - .overlay { - RoundedRectangle(cornerRadius: 10) - .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 1) - } } .buttonStyle(HoldDownButtonStyle()) case let .warning(image): @@ -38,10 +34,6 @@ public struct PhotoGrid: View { .aspectRatio(3 / 4, contentMode: .fill) .clipped() .clipShape(RoundedRectangle(cornerRadius: 10)) - .overlay { - RoundedRectangle(cornerRadius: 10) - .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 1) - } } .buttonStyle(HoldDownButtonStyle()) case .empty: @@ -51,19 +43,12 @@ public struct PhotoGrid: View { selectionBehavior: .default, preferredItemEncoding: .automatic ) { - Color(uiColor: UIColor.secondarySystemBackground) + Color(uiColor: UIColor.secondarySystemFill) .aspectRatio(3 / 4, contentMode: .fill) .cornerRadius(10) .overlay { PlusIcon() } - .overlay { - RoundedRectangle(cornerRadius: 10) - .stroke( - Color(uiColor: UIColor.opaqueSeparator), - style: StrokeStyle(dash: [8, 8]) - ) - } } .buttonStyle(HoldDownButtonStyle()) } diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift index 6482b0a0..c3ef57c0 100644 --- a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift +++ b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift @@ -5,22 +5,9 @@ struct PlusIcon: View { var body: some View { Image(systemName: "plus") .frame(width: 32, height: 32) - .foregroundStyle(Color.white) - .background( - LinearGradient( - colors: [ - Color(0xFFFD_2D76), - Color(0xFFFE_7056), - ], - startPoint: .bottomLeading, - endPoint: .topTrailing - ) - ) + .foregroundStyle(Color.black) + .background(Color.white) .clipShape(Circle()) - .overlay { - RoundedRectangle(cornerRadius: 32 / 2) - .stroke(Color.white, lineWidth: 1) - } } } diff --git a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift index a4f72cf9..a3d90c5c 100644 --- a/Packages/PicMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift +++ b/Packages/PicMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift @@ -25,28 +25,14 @@ public struct ProfilePictureSettingView: View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 8) { ScrollView { - VStack(spacing: 36) { + VStack(spacing: 32) { VStack(spacing: 8) { - Text("Set your saved photo to your profile (it will be public 🌏)", bundle: .module) - .lineLimit(2) - .frame(minHeight: 50) - .layoutPriority(1) - .font(.system(.title3, weight: .semibold)) + Text("Set your profile pic.", bundle: .module) + .font(.system(.title2, design: .rounded, weight: .bold)) - if viewStore.isWarningTextVisible { - Button { - store.send(.howToButtonTapped) - } label: { - HStack(spacing: 2) { - Image(systemName: "exclamationmark.triangle.fill") - .foregroundStyle(Color.yellow) - - Text("Select a photo saved with BeReal.", bundle: .module) - .foregroundStyle(Color.secondary) - } - .font(.callout) - } - } + Text("It will be public 🌎", bundle: .module) + .font(.system(.footnote, design: .rounded, weight: .semibold)) + .foregroundStyle(Color.secondary) } LazyVGrid( @@ -78,7 +64,7 @@ public struct ProfilePictureSettingView: View { PrimaryButton( nextButtonStyle == .save ? String(localized: "Save", bundle: .module) - : String(localized: "Next", bundle: .module), + : String(localized: "Continue", bundle: .module), isLoading: viewStore.isActivityIndicatorVisible ) { store.send(.nextButtonTapped) diff --git a/Packages/PicMatch/Sources/ProfileSharedFeature/PictureSlider.swift b/Packages/PicMatch/Sources/ProfileSharedFeature/PictureSlider.swift index 4fa05644..cf69987f 100644 --- a/Packages/PicMatch/Sources/ProfileSharedFeature/PictureSlider.swift +++ b/Packages/PicMatch/Sources/ProfileSharedFeature/PictureSlider.swift @@ -7,6 +7,7 @@ import SwiftUI public struct PictureSliderView: View { @Environment(\.displayScale) var displayScale let store: StoreOf + let width = UIScreen.main.bounds.width public init(store: StoreOf) { self.store = store @@ -15,13 +16,6 @@ public struct PictureSliderView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 24) { - SelectControl( - current: viewStore.selection, - items: viewStore.data.images - ) - .padding(.top, 3) - .padding(.horizontal, 16) - ForEach(viewStore.data.images, id: \.id) { picture in if picture == viewStore.selection { CachedAsyncImage( @@ -31,12 +25,13 @@ public struct PictureSliderView: View { content: { content in content .resizable() - .aspectRatio(3 / 4, contentMode: .fit) - .frame(width: UIScreen.main.bounds.size.width) + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) }, placeholder: { Color.black - .aspectRatio(3 / 4, contentMode: .fill) + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) .overlay { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -46,31 +41,29 @@ public struct PictureSliderView: View { ) } } + .overlay(alignment: .top) { + SelectControl( + current: viewStore.selection, + items: viewStore.data.images + ) + .padding(.top, 8) + .padding(.horizontal, 40) + } .overlay(alignment: .bottom) { if let shortComment = viewStore.data.shortComment?.body { - ZStack(alignment: .bottom) { - LinearGradient( - colors: [ - Color.black.opacity(0.0), - Color.black.opacity(1.0), - ], - startPoint: .top, - endPoint: .bottom - ) - - Text(shortComment) - .font(.system(.subheadline, weight: .semibold)) - .padding(.bottom, 8) - .padding(.horizontal, 16) - } - .multilineTextAlignment(.center) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .frame(height: UIScreen.main.bounds.width / 3 * 2) + Text(shortComment) + .padding(.vertical, 12) + .padding(.horizontal, 24) + .background(Material.ultraThin) + .clipShape(Capsule()) + .padding(.bottom, 16) + .padding(.horizontal, 32) + .multilineTextAlignment(.center) + .font(.system(.footnote, design: .rounded, weight: .semibold)) } } .clipShape(RoundedRectangle(cornerRadius: 16)) - .aspectRatio(3 / 4, contentMode: .fill) - .frame(width: UIScreen.main.bounds.size.width) + .frame(width: width, height: width * (4 / 3)) .overlay { HStack(spacing: 0) { Color.clear diff --git a/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings index 7a109ae8..3333fead 100644 --- a/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings @@ -3,48 +3,120 @@ "strings" : { "Looks like he's gone." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "もういないみたい..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "그는 떠난 것 같아요." + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "On dirait qu'il est parti." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "もういないみたい..." + "value" : "Wygląda na to, że go nie ma." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Có vẻ như anh ấy đã đi rồi." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Parece que se ha ido." } } } }, "See who likes you" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "あなたをLikeした人" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "누가 당신을 좋아하는지 확인하세요" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Voir qui vous aime" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "あなたをLikeした人" + "value" : "Zobacz, kto cię lubi" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Xem ai thích bạn" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ver quién te gusta" } } } }, "Swipe others" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "他の人をスワイプする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "다른 사람들 스와이프" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Balayez les autres" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "他の人をスワイプする" + "value" : "Przesuń innych" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuốt người khác" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desliza a otros" } } } diff --git a/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift b/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift index a88bec8e..a65a039f 100644 --- a/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift +++ b/Packages/PicMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift @@ -61,7 +61,7 @@ public struct ReceivedLikeSwipeView: View { .frame(width: 120) Text("Looks like he's gone.", bundle: .module) - .font(.system(.title3, weight: .semibold)) + .font(.system(.title3, design: .rounded, weight: .semibold)) PrimaryButton( String(localized: "Swipe others", bundle: .module) diff --git a/Packages/PicMatch/Sources/RecentMatchFeature/LikeGrid.swift b/Packages/PicMatch/Sources/RecentMatchFeature/LikeGrid.swift index 82f8865d..efc29aee 100644 --- a/Packages/PicMatch/Sources/RecentMatchFeature/LikeGrid.swift +++ b/Packages/PicMatch/Sources/RecentMatchFeature/LikeGrid.swift @@ -15,11 +15,11 @@ public struct LikeGridView: View { var goldGradient: LinearGradient { LinearGradient( colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), + Color(0xFF9F0A), + Color(0xFFD60A), ], - startPoint: .leading, - endPoint: .trailing + startPoint: .top, + endPoint: .bottom ) } @@ -28,7 +28,7 @@ public struct LikeGridView: View { Button { store.send(.gridButtonTapped) } label: { - VStack(spacing: 0) { + VStack(spacing: 8) { CachedAsyncImage( url: URL(string: viewStore.imageUrl), urlCache: .shared, @@ -36,12 +36,12 @@ public struct LikeGridView: View { content: { image in image .resizable() - .aspectRatio(3 / 4, contentMode: .fill) + .aspectRatio(1, contentMode: .fill) .blur(radius: 18) }, placeholder: { Color.black - .aspectRatio(3 / 4, contentMode: .fill) + .aspectRatio(1, contentMode: .fill) .overlay { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -55,22 +55,24 @@ public struct LikeGridView: View { .stroke(goldGradient, lineWidth: 3) } .overlay { - Text(viewStore.receivedCount) - .font(.system(.body, weight: .semibold)) - .frame(width: 40, height: 40) - .foregroundStyle(Color.white) - .background(goldGradient) - .clipShape(Circle()) - } - .overlay(alignment: .bottom) { - Image(ImageResource.receivedLike) - .offset(y: 17) + HStack(alignment: .center, spacing: 0) { + Text(Image(systemName: "heart.fill")) + .font(.system(size: 14)) + + Text(viewStore.receivedCount) + .font(.system(.body, design: .rounded, weight: .semibold)) + } + .foregroundStyle(Color.black) + .padding(.vertical, 4) + .padding(.horizontal, 6) + .background(goldGradient) + .clipShape(RoundedRectangle(cornerRadius: .infinity)) } Text("Liked by \(viewStore.receivedCount) people", bundle: .module) .foregroundStyle(Color.primary) - .font(.system(.subheadline, weight: .semibold)) - .frame(maxWidth: .infinity, minHeight: 54, maxHeight: .infinity, alignment: .leading) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) + .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) } } } diff --git a/Packages/PicMatch/Sources/RecentMatchFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/RecentMatchFeature/Localizable.xcstrings index db28d6b7..5930c597 100644 --- a/Packages/PicMatch/Sources/RecentMatchFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/RecentMatchFeature/Localizable.xcstrings @@ -3,32 +3,80 @@ "strings" : { "Liked by %@ people" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@人にLikeされてます" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@명이 좋아합니다" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Aimé par %@ personnes" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "%@人にLikeされてます" + "value" : "Polubione przez %@ osób" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Được %@ người thích" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "A %@ personas les gusta" } } } }, - "RECENT MATCH" : { + "Recently Match" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "最近のマッチ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "최근 매치" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "RENCONTRE RÉCENTE" + "value" : "Correspondance récente" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "最近のマッチ" + "value" : "Ostatnio dopasowane" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khớp gần đây" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Emparejamiento reciente" } } } diff --git a/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatch.swift b/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatch.swift index 3a57f0f8..c6848952 100644 --- a/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatch.swift +++ b/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatch.swift @@ -29,6 +29,6 @@ public struct RecentMatchView: View { .task { await store.send(.onTask).finish() } .toolbar(.visible, for: .tabBar) .navigationBarTitleDisplayMode(.inline) - .navigationTitle(String(localized: "RECENT MATCH", bundle: .module)) + .navigationTitle(String(localized: "Recently Match", bundle: .module)) } } diff --git a/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift b/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift index 0bfefe4e..a32fc079 100644 --- a/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift +++ b/Packages/PicMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift @@ -7,6 +7,7 @@ import SwiftUI public struct RecentMatchGridView: View { @Environment(\.displayScale) var displayScale let store: StoreOf + let width = UIScreen.main.bounds.width public init(store: StoreOf) { self.store = store @@ -17,7 +18,7 @@ public struct RecentMatchGridView: View { Button { store.send(.matchButtonTapped) } label: { - VStack(spacing: 20) { + VStack(spacing: 8) { CachedAsyncImage( url: URL(string: viewStore.imageUrl), urlCache: .shared, @@ -25,11 +26,13 @@ public struct RecentMatchGridView: View { content: { image in image .resizable() - .aspectRatio(3 / 4, contentMode: .fill) + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) }, placeholder: { Color.black - .aspectRatio(3 / 4, contentMode: .fill) + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) .overlay { ProgressView() .progressViewStyle(CircularProgressViewStyle()) @@ -40,25 +43,21 @@ public struct RecentMatchGridView: View { .clipShape(RoundedRectangle(cornerRadius: 6)) .overlay(alignment: .bottom) { if !viewStore.isRead { - Color.pink + Color(0xFFD60A) .frame(width: 16, height: 16) .clipShape(Circle()) - .overlay { - RoundedRectangle(cornerRadius: 16 / 2) - .stroke(Color.white, lineWidth: 2) - } - .offset(y: 10) + .offset(y: 8) } } - VStack(spacing: 8) { + VStack(spacing: 4) { Text(viewStore.displayName) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(maxWidth: .infinity, alignment: .leading) Text(viewStore.createdAt, format: Date.FormatStyle(date: .numeric)) .foregroundStyle(Color.gray) - .font(.system(.caption2, weight: .semibold)) + .font(.system(.caption2, design: .rounded, weight: .semibold)) .frame(maxWidth: .infinity, alignment: .leading) } } diff --git a/Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Contents.json similarity index 100% rename from Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/matched.imageset/Contents.json rename to Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Contents.json diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Frame 625063.pdf b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Frame 625063.pdf similarity index 100% rename from Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Frame 625063.pdf rename to Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Frame 625063.pdf diff --git a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/Contents.json b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/Contents.json deleted file mode 100644 index 087dbfd6..00000000 --- a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "high-alert.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/high-alert.pdf b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/high-alert.pdf deleted file mode 100644 index 914a27d9..00000000 Binary files a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/high-alert.imageset/high-alert.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/RecommendationFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/RecommendationFeature/Localizable.xcstrings index 88980a08..3f1fdbfc 100644 --- a/Packages/PicMatch/Sources/RecommendationFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/RecommendationFeature/Localizable.xcstrings @@ -1,38 +1,86 @@ { "sourceLanguage" : "en", "strings" : { - "Just a little... Too much swiping... Please help me share BeMatch... 🙏." : { + "Share" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Compartir" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Juste un peu... Trop de balayages... Aidez-moi à partager BeMatch... 🙏." + "value" : "Partager" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "ちょっと...スワイプしすぎです...。BeMatchのシェアに協力してください... 🙏" + "value" : "シェアする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "공유" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udostępnij" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chia sẻ" } } } }, - "Share" : { + "Too much swiping...\nPlease help us share TenMatch... 🙏" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Demasiado deslizamiento...\nPor favor, ayúdanos a compartir TenMatch... 🙏" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Partager" + "value" : "Trop de balayage...\nAidez-nous à partager TenMatch... 🙏" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "シェアする" + "value" : "ちょっと...スワイプしすぎです...。
TenMatchのシェアに協力してください... 🙏" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "너무 많이 스와이프...\n장신구 공유를 도와주세요... 🙏" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Za dużo przesuń...\nProszę, pomóż nam udostępnić TenMatch... 🙏" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quẹt quá nhiều...\nXin hãy giúp chúng tôi chia sẻ TenMatch... 🙏" } } } } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/RecommendationFeature/RecommendationEmpty.swift b/Packages/PicMatch/Sources/RecommendationFeature/RecommendationEmpty.swift index 36393e11..3af33a1a 100644 --- a/Packages/PicMatch/Sources/RecommendationFeature/RecommendationEmpty.swift +++ b/Packages/PicMatch/Sources/RecommendationFeature/RecommendationEmpty.swift @@ -14,14 +14,15 @@ public struct RecommendationEmptyView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 40) { - Image(ImageResource.highAlert) + Image(ImageResource.break) .resizable() .aspectRatio(contentMode: .fit) - .frame(height: 160) + .frame(maxWidth: .infinity) + .padding(.horizontal, 37) VStack(spacing: 16) { - Text("Just a little... Too much swiping... Please help me share BeMatch... 🙏.", bundle: .module) - .font(.system(.subheadline, weight: .semibold)) + Text("Too much swiping...\nPlease help us share TenMatch... 🙏", bundle: .module) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .foregroundStyle(Color.white) .multilineTextAlignment(.center) @@ -29,7 +30,7 @@ public struct RecommendationEmptyView: View { store.send(.shareButtonTapped) } label: { Text("Share", bundle: .module) - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(height: 50) .frame(maxWidth: .infinity) .foregroundStyle(Color.black) @@ -38,9 +39,19 @@ public struct RecommendationEmptyView: View { } .buttonStyle(HoldDownButtonStyle()) } + .padding(.horizontal, 16) } - .padding(.horizontal, 16) - .background(Color.black) + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background( + LinearGradient( + colors: [ + Color(0xFFB8_5BE9), + Color(0xFF00_0000), + ], + startPoint: .topTrailing, + endPoint: .bottomLeading + ) + ) .task { await store.send(.onTask).finish() } .sheet(isPresented: viewStore.$isPresented) { ActivityView( @@ -63,11 +74,18 @@ public struct RecommendationEmptyView: View { } #Preview { - RecommendationEmptyView( - store: .init( - initialState: RecommendationEmptyLogic.State(), - reducer: { RecommendationEmptyLogic() } + NavigationStack { + RecommendationEmptyView( + store: .init( + initialState: RecommendationEmptyLogic.State(), + reducer: { RecommendationEmptyLogic() } + ) ) - ) + .toolbar { + ToolbarItem(placement: .principal) { + Image(ImageResource.logo) + } + } + } .environment(\.locale, Locale(identifier: "ja-JP")) } diff --git a/Packages/PicMatch/Sources/ReportFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ReportFeature/Localizable.xcstrings index f89f1d62..ec2dfd00 100644 --- a/Packages/PicMatch/Sources/ReportFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ReportFeature/Localizable.xcstrings @@ -3,176 +3,440 @@ "strings" : { "Fake profile" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "偽のプロフィール" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "가짜 프로필" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Faux profil" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "偽のプロフィール" + "value" : "Fałszywy profil" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hồ sơ giả" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Perfil falso" } } } }, "If you or someone you know is in immediate danger, contact local low enforcement or your local emergency services immediately." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "犯罪に関わる行為(殺害予告、援助交際、薬物売買など)は、警察に連絡してください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "당신이나 당신이 아는 사람이 즉각적인 위험에 처해 있다면, 즉시 지역 경찰 또는 응급 서비스에 연락하세요." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Si vous ou quelqu'un que vous connaissez est en danger immédiat, contactez les forces de l'ordre locales ou les services d'urgence locaux immédiatement." + "value" : "Si vous ou quelqu'un que vous connaissez est en danger immédiat, contactez immédiatement les forces de l'ordre locales ou les services d'urgence." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "犯罪に関わる行為(殺害予告、援助交際、薬物売買など)は、警察に連絡してください。" + "value" : "Jeśli Ty lub ktoś, kogo znasz, jest w bezpośrednim niebezpieczeństwie, natychmiast skontaktuj się z lokalnymi służbami porządkowymi lub ratunkowymi." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nếu bạn hoặc ai đó mà bạn biết đang gặp nguy hiểm ngay lập tức, hãy liên hệ ngay với cơ quan thực thi pháp luật địa phương hoặc dịch vụ khẩn cấp địa phương." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si usted o alguien que conoce está en peligro inmediato, contacte inmediatamente a las fuerzas del orden locales o a los servicios de emergencia." } } } }, "Minimum of 10 characters required." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "10文字以上入力する必要があります。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "최소 10자 이상 입력해야 합니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Minimum de 10 caractères requis." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "10文字以上入力する必要があります。" + "value" : "Wymagane jest minimum 10 znaków." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yêu cầu tối thiểu 10 ký tự." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Se requieren un mínimo de 10 caracteres." } } } }, "Nudity or something sexualy explicit" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ヌードや性的に露骨な表現" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "누드 또는 성적으로 노골적인 내용" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Nudité ou contenu sexuellement explicite" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ヌードや性的に露骨な表現" + "value" : "Nagość lub treści o charakterze seksualnym" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nội dung khỏa thân hoặc khiêu dâm" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Desnudez o contenido sexual explícito" } } } }, "Other" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "その他" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "기타" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Autre" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "その他" + "value" : "Inne" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Khác" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otro" } } } }, - "Report a BeMatch." : { + "Report a TenMatch" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通報する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "트링켓 신고하기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Signaler un BeMatch." + "value" : "Signaler un TenMatch" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "通報する" + "value" : "Zgłoś TenMatch" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Báo cáo một TenMatch" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reportar un TenMatch" } } } }, "Send" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "送信" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "보내기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Envoyer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "送信" + "value" : "Wyślij" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gửi" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enviar" } } } }, "Spam" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スパム" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "스팸" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Spam" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "スパム" + "value" : "Spam" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Thư rác" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Correo no deseado" } } } }, "Suicide or self-harm" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "自殺または自傷" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "자살 또는 자해" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Suicide ou automutilation" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "自殺または自傷" + "value" : "Samobójstwo lub samookaleczenie" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tự tử hoặc tự gây hại" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suicidio o autolesiones" } } } }, "Violent or dangerous" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "暴力または危険" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "폭력적 또는 위험한" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Violent ou dangereux" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "暴力または危険" + "value" : "Gwałtowny lub niebezpieczny" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bạo lực hoặc nguy hiểm" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Violento o peligroso" } } } }, "Your report is confidential." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ご報告の内容は秘密厳守で丁寧に管理いたします。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "신고 내용은 기밀로 처리됩니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Votre signalement est confidentiel." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ご報告の内容は秘密厳守で丁寧に管理いたします。" + "value" : "Twoje zgłoszenie jest poufne." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Báo cáo của bạn được bảo mật." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Su informe es confidencial." } } } diff --git a/Packages/PicMatch/Sources/ReportFeature/Report.swift b/Packages/PicMatch/Sources/ReportFeature/Report.swift index 40e452f4..e31a4560 100644 --- a/Packages/PicMatch/Sources/ReportFeature/Report.swift +++ b/Packages/PicMatch/Sources/ReportFeature/Report.swift @@ -36,7 +36,7 @@ public struct ReportView: View { } } } - .navigationTitle(String(localized: "Report a BeMatch.", bundle: .module)) + .navigationTitle(String(localized: "Report a TenMatch", bundle: .module)) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .topBarLeading) { diff --git a/Packages/PicMatch/Sources/ReportFeature/ReportReason.swift b/Packages/PicMatch/Sources/ReportFeature/ReportReason.swift index bb4ea7b9..595a5377 100644 --- a/Packages/PicMatch/Sources/ReportFeature/ReportReason.swift +++ b/Packages/PicMatch/Sources/ReportFeature/ReportReason.swift @@ -21,7 +21,7 @@ public struct ReportReasonView: View { .layoutPriority(1) .frame(minHeight: 50) } - .font(.system(.footnote)) + .font(.system(.footnote, design: .rounded)) VStack(alignment: .leading, spacing: 8) { TextEditor(text: viewStore.$text) @@ -35,7 +35,7 @@ public struct ReportReasonView: View { Text("Minimum of 10 characters required.", bundle: .module) .foregroundStyle(Color.secondary) - .font(.caption) + .font(.system(.caption, design: .rounded)) } Spacer() @@ -51,7 +51,7 @@ public struct ReportReasonView: View { .padding(.vertical, 24) .padding(.horizontal, 16) .formStyle(ColumnsFormStyle()) - .navigationTitle(Text("Report a BeMatch.", bundle: .module)) + .navigationTitle(Text("Report a TenMatch", bundle: .module)) .navigationBarTitleDisplayMode(.inline) .task { await store.send(.onTask).finish() } .bind(viewStore.$focus, to: $focus) diff --git a/Packages/PicMatch/Sources/SettingsFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/SettingsFeature/Localizable.xcstrings index 5d03a4cf..3bc126be 100644 --- a/Packages/PicMatch/Sources/SettingsFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/SettingsFeature/Localizable.xcstrings @@ -15,16 +15,16 @@ "value" : "基本情報" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "VỀ CHÚNG TÔI" + "value" : "정보" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "정보" + "value" : "VỀ CHÚNG TÔI" } } } @@ -43,16 +43,16 @@ "value" : "お問い合わせ" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Liên hệ với chúng tôi" + "value" : "문의하기" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "문의하기" + "value" : "Liên hệ với chúng tôi" } } } @@ -71,16 +71,16 @@ "value" : "アカウントを削除する" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Xóa tài khoản" + "value" : "계정 삭제" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "계정 삭제" + "value" : "Xóa tài khoản" } } } @@ -99,16 +99,16 @@ "value" : "プロフィール編集" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Chỉnh sửa hồ sơ" + "value" : "프로필 수정" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "프로필 수정" + "value" : "Chỉnh sửa hồ sơ" } } } @@ -127,16 +127,16 @@ "value" : "よくある質問" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Câu hỏi thường gặp" + "value" : "자주 묻는 질문" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "자주 묻는 질문" + "value" : "Câu hỏi thường gặp" } } } @@ -155,16 +155,16 @@ "value" : "ヘルプ" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Trợ giúp" + "value" : "도움말" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "도움말" + "value" : "Trợ giúp" } } } @@ -180,19 +180,19 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatchの使い方" + "value" : "TenMatchの使い方" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Cách hoạt động" + "value" : "작동 방식" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "작동 방식" + "value" : "Cách hoạt động" } } } @@ -211,16 +211,16 @@ "value" : "会員ステータス" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Tình trạng hội viên" + "value" : "회원 상태" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "회원 상태" + "value" : "Tình trạng hội viên" } } } @@ -239,16 +239,16 @@ "value" : "自分のプロフィール" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Hồ sơ của tôi" + "value" : "내 프로필" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "내 프로필" + "value" : "Hồ sơ của tôi" } } } @@ -267,16 +267,16 @@ "value" : "その他" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Khác" + "value" : "기타" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "기타" + "value" : "Khác" } } } @@ -295,16 +295,16 @@ "value" : "プライバシーポリシー" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Chính sách bảo mật" + "value" : "개인정보 처리방침" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "개인정보 처리방침" + "value" : "Chính sách bảo mật" } } } @@ -323,16 +323,16 @@ "value" : "プロフィール" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "HỒ SƠ" + "value" : "프로필" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "프로필" + "value" : "HỒ SƠ" } } } @@ -345,44 +345,48 @@ "value" : "プッシュ通知" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Thông báo đẩy" + "value" : "푸시 알림" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "푸시 알림" + "value" : "Thông báo đẩy" } } } }, - "Rate BeMatch." : { + "Rate TenMatch" : { + + }, + "Rate TenMatch." : { + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Évaluer BeMatch." + "value" : "Évaluer TenMatch." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatchを評価" + "value" : "TenMatchを評価" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Đánh giá BeMatch." + "value" : "TenMatch 평가하기" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch 평가하기" + "value" : "Đánh giá TenMatch." } } } @@ -401,44 +405,44 @@ "value" : "設定" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Cài đặt" + "value" : "설정" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "설정" + "value" : "Cài đặt" } } } }, - "Share BeMatch." : { + "Share TenMatch" : { "localizations" : { "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Partager BeMatch." + "value" : "Partager TenMatch" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatchをシェア" + "value" : "TenMatchをシェア" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Chia sẻ BeMatch." + "value" : "TenMatch 공유하기" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch 공유하기" + "value" : "Chia sẻ TenMatch" } } } @@ -457,16 +461,16 @@ "value" : "利用規約" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Điều khoản sử dụng" + "value" : "이용 약관" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "이용 약관" + "value" : "Điều khoản sử dụng" } } } @@ -485,20 +489,20 @@ "value" : "バージョン" } }, - "vi" : { + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "Phiên bản" + "value" : "버전" } }, - "ko" : { + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "버전" + "value" : "Phiên bản" } } } } }, "version" : "1.0" -} +} \ No newline at end of file diff --git a/Packages/PicMatch/Sources/SettingsFeature/Settings.swift b/Packages/PicMatch/Sources/SettingsFeature/Settings.swift index d9f913a2..bdc67fd6 100644 --- a/Packages/PicMatch/Sources/SettingsFeature/Settings.swift +++ b/Packages/PicMatch/Sources/SettingsFeature/Settings.swift @@ -141,7 +141,7 @@ public struct SettingsView: View { LabeledContent { Image(systemName: "chevron.right") } label: { - Text("Share BeMatch.", bundle: .module) + Text("Share TenMatch", bundle: .module) .foregroundStyle(Color.primary) } } @@ -152,7 +152,7 @@ public struct SettingsView: View { LabeledContent { Image(systemName: "chevron.right") } label: { - Text("Rate BeMatch.", bundle: .module) + Text("Rate TenMatch", bundle: .module) .foregroundStyle(Color.primary) } } diff --git a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings index 3aa4ef03..0ff29a53 100644 --- a/Packages/PicMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings @@ -3,48 +3,120 @@ "strings" : { "Comment" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ひとこと" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "댓글" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Commentaire" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ひとこと" + "value" : "Komentarz" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bình luận" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comentario" } } } }, - "Do not write vour BeReal or other social media username.Your profile will not be visible to others." : { + "Do not write tenten or other social media username." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "tentenや他のSNSのIDを書かないでください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "tenten 또는 다른 소셜 미디어 사용자 이름을 작성하지 마세요." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "N'écrivez pas votre nom d'utilisateur BeReal ou d'autres réseaux sociaux. Votre profil ne sera pas visible par les autres." + "value" : "Ne pas écrire le nom d'utilisateur tenten ou d'autres réseaux sociaux." } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie wpisuj nazwy użytkownika tenten ani innych mediów społecznościowych." + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealや他のソーシャルメディアのユーザーネームを書かないでください。あなたのプロフィールは他の人には見えません。" + "value" : "Không viết tên người dùng tenten hoặc các mạng xã hội khác." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "No escriba el nombre de usuario de tenten u otras redes sociales." } } } }, "Save" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "保存する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "저장" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Enregistrer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "保存する" + "value" : "Zapisz" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lưu" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guardar" } } } diff --git a/Packages/PicMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift b/Packages/PicMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift index d968300d..3a7e4b46 100644 --- a/Packages/PicMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift +++ b/Packages/PicMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift @@ -14,8 +14,8 @@ public struct ShortCommentSettingView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in VStack(spacing: 24) { - Text("Do not write vour BeReal or other social media username.Your profile will not be visible to others.", bundle: .module) - .font(.subheadline) + Text("Do not write tenten or other social media username.", bundle: .module) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .foregroundStyle(Color.secondary) TextEditor(text: viewStore.$shortComment) diff --git a/Packages/PicMatch/Sources/Styleguide/Buttons.swift b/Packages/PicMatch/Sources/Styleguide/Buttons.swift index c1624426..7aa6ef4c 100644 --- a/Packages/PicMatch/Sources/Styleguide/Buttons.swift +++ b/Packages/PicMatch/Sources/Styleguide/Buttons.swift @@ -11,7 +11,7 @@ public struct HoldDownButtonStyle: ButtonStyle { #Preview { Button(action: {}) { - Text("Next") + Text("Continue") .frame(height: 54) .frame(maxWidth: .infinity) .foregroundStyle(.white) diff --git a/Packages/PicMatch/Sources/Styleguide/PrimaryButton.swift b/Packages/PicMatch/Sources/Styleguide/PrimaryButton.swift index 4ce9c133..4c4f8ebd 100644 --- a/Packages/PicMatch/Sources/Styleguide/PrimaryButton.swift +++ b/Packages/PicMatch/Sources/Styleguide/PrimaryButton.swift @@ -29,13 +29,17 @@ public struct PrimaryButton: View { Text(title) } } - .font(.system(.subheadline, weight: .semibold)) + .font(.system(.subheadline, design: .rounded, weight: .semibold)) .frame(height: 50) .frame(maxWidth: .infinity) - .foregroundStyle(Color.black) + .foregroundStyle( + isLoading || isDisabled + ? Color(uiColor: UIColor.quaternaryLabel) + : Color.black + ) .background( isLoading || isDisabled - ? Color(uiColor: UIColor.systemGray2) + ? Color(uiColor: UIColor.secondarySystemBackground) : Color.white ) .cornerRadius(16) diff --git a/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf b/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf index 6fb35a92..aceda3ee 100644 Binary files a/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf and b/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf differ diff --git a/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf b/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf index ba76bc39..0db5a112 100644 Binary files a/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf and b/Packages/PicMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf differ diff --git a/Packages/PicMatch/Sources/SwipeCardFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/SwipeCardFeature/Localizable.xcstrings index 117f24bf..a92241aa 100644 --- a/Packages/PicMatch/Sources/SwipeCardFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/SwipeCardFeature/Localizable.xcstrings @@ -3,36 +3,84 @@ "strings" : { "Block" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ブロックする" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "차단" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Bloquer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ブロックする" + "value" : "Blokuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chặn" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bloquear" } } } }, "Report" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "通報する" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "신고" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Signaler" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "通報する" + "value" : "Zgłoś" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Báo cáo" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reportar" } } } } }, "version" : "1.0" -} \ No newline at end of file +} diff --git a/Packages/PicMatch/Sources/SwipeCardFeature/SwipeCard.swift b/Packages/PicMatch/Sources/SwipeCardFeature/SwipeCard.swift index 61a8e1dd..d5a88388 100644 --- a/Packages/PicMatch/Sources/SwipeCardFeature/SwipeCard.swift +++ b/Packages/PicMatch/Sources/SwipeCardFeature/SwipeCard.swift @@ -1,3 +1,4 @@ +import API import CachedAsyncImage import ComposableArchitecture import SelectControl @@ -8,6 +9,7 @@ public struct SwipeCardView: View { @Environment(\.displayScale) var displayScale let store: StoreOf @State var translation: CGSize = .zero + let width = UIScreen.main.bounds.width public init(store: StoreOf) { self.store = store @@ -15,213 +17,197 @@ public struct SwipeCardView: View { public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in - GeometryReader { proxy in - ForEach(viewStore.data.images, id: \.id) { image in - if image == viewStore.selection { - CachedAsyncImage( - url: URL(string: image.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { content in - content - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: proxy.size.width, height: proxy.size.width * (4 / 3)) - }, - placeholder: { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - .frame(width: proxy.size.width, height: proxy.size.width * (4 / 3)) - .background() - } - ) - .cornerRadius(16) - .overlay(alignment: .top) { - SelectControl( - current: viewStore.selection, - items: viewStore.data.images - ) - .padding(.top, 3) - .padding(.horizontal, 16) - } - .overlay(alignment: .topLeading) { - Image(ImageResource.like) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(height: 100) - .rotationEffect(.degrees(-15)) - .offset(x: 30, y: 60) - .opacity(translation.width) - } - .overlay(alignment: .topTrailing) { - Image(ImageResource.nope) + ForEach(viewStore.data.images, id: \.id) { image in + if image == viewStore.selection { + CachedAsyncImage( + url: URL(string: image.imageUrl), + urlCache: .shared, + scale: displayScale, + content: { content in + content .resizable() - .aspectRatio(contentMode: .fit) - .frame(height: 100) - .rotationEffect(.degrees(15)) - .offset(x: -30, y: 60) - .opacity(-translation.width) + .aspectRatio(contentMode: .fill) + .frame(width: width, height: width * (4 / 3)) + }, + placeholder: { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .tint(Color.white) + .frame(width: width, height: width * (4 / 3)) + .background() } + ) + .cornerRadius(16) + .overlay(alignment: .top) { + SelectControl( + current: viewStore.selection, + items: viewStore.data.images + ) + .padding(.top, 8) + .padding(.horizontal, 40) + } + .overlay(alignment: .topLeading) { + Image(ImageResource.like) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 310) + .offset(x: -50, y: -110) + .opacity(translation.width) + } + .overlay(alignment: .topTrailing) { + Image(ImageResource.nope) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 260) + .offset(x: 0, y: -110) + .opacity(-translation.width) } } - .overlay(alignment: .topTrailing) { - Menu { - Button { - store.send(.reportButtonTapped) - } label: { - Text("Report", bundle: .module) - } + } + .overlay(alignment: .topTrailing) { + Menu { + Button { + store.send(.reportButtonTapped) + } label: { + Text("Report", bundle: .module) + } - Button { - store.send(.swipeToNope) - } label: { - Text("Block", bundle: .module) - } + Button { + store.send(.swipeToNope) } label: { - Image(systemName: "ellipsis") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - .padding(.all, 4) + Text("Block", bundle: .module) } + } label: { + Image(systemName: "ellipsis") + .bold() + .foregroundStyle(Color.white) + .frame(width: 44, height: 44) + .padding(.all, 4) } - .overlay(alignment: .bottom) { - if let shortComment = viewStore.data.shortComment?.body { - ZStack(alignment: .bottom) { - LinearGradient( - colors: [ - Color.black.opacity(0.0), - Color.black.opacity(1.0), - ], - startPoint: .top, - endPoint: .bottom - ) - - Text(shortComment) - .font(.system(.subheadline, weight: .semibold)) - .padding(.bottom, 8) - .padding(.horizontal, 16) - } + } + .overlay(alignment: .bottom) { + if let shortComment = viewStore.data.shortComment?.body { + Text(shortComment) + .padding(.vertical, 12) + .padding(.horizontal, 24) + .background(Material.ultraThin) + .clipShape(Capsule()) + .padding(.bottom, 16) + .padding(.horizontal, 32) .multilineTextAlignment(.center) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .frame(width: proxy.size.width, height: proxy.size.width * (4 / 3) / 2) - } + .font(.system(.footnote, design: .rounded, weight: .semibold)) } - .offset(translation) - .rotationEffect(.degrees(Double(translation.width / 300) * 25), anchor: .bottom) - .gesture( - DragGesture() - .onChanged { translation = $0.translation } - .onEnded { _ in - let targetHorizontalTranslation = UIScreen.main.bounds.width / 2 + max(proxy.size.height, proxy.size.width) / 2 - withAnimation { - switch translation.width { - case let width where width > 100: - translation = CGSize(width: targetHorizontalTranslation, height: translation.height) - store.send(.swipeToLike) - case let width where width < -100: - translation = CGSize(width: -targetHorizontalTranslation, height: translation.height) - store.send(.swipeToNope) - default: - translation = CGSize.zero - } + } + .offset(translation) + .rotationEffect(.degrees(Double(translation.width / 300) * 25), anchor: .bottom) + .gesture( + DragGesture() + .onChanged { translation = $0.translation } + .onEnded { _ in + let targetHorizontalTranslation = UIScreen.main.bounds.width / 2 + UIScreen.main.bounds.width / 2 + withAnimation { + switch translation.width { + case let width where width > 100: + translation = CGSize(width: targetHorizontalTranslation, height: translation.height) + store.send(.swipeToLike) + case let width where width < -100: + translation = CGSize(width: -targetHorizontalTranslation, height: translation.height) + store.send(.swipeToNope) + default: + translation = CGSize.zero } } - ) - .gesture( - DragGesture(minimumDistance: 0) - .onEnded { value in - if value.translation.equalTo(.zero) { - if value.location.x <= proxy.size.width / 2 { - store.send(.backButtonTapped) - } else { - store.send(.forwardButtonTapped) - } + } + ) + .gesture( + DragGesture(minimumDistance: 0) + .onEnded { value in + if value.translation.equalTo(.zero) { + if value.location.x <= UIScreen.main.bounds.width / 2 { + store.send(.backButtonTapped) + } else { + store.send(.forwardButtonTapped) } } - ) - } + } + ) } } } -// #Preview { -// SwipeCardView( -// store: .init( -// initialState: SwipeCardLogic.State( -// data: API.SwipeCard( -// _dataDict: DataDict( -// data: [ -// "id": "1", -// "shortComment": [ -// DataDict( -// data: [ -// "id": "1", -// "userId": "1", -// "body": "生まれたからには世界中の人と仲良くなりたいです。近くに住んでいる人いたら教えてください。", -// ], -// fulfilledFragments: [] -// ), -// ], -// "images": [ -// DataDict( -// data: [ -// "id": "1", -// "imageUrl": "https://asia-northeast1-bematch-staging.cloudfunctions.net/onRequestResizedImage/users/profile_images/vJ2NQU467OgyW6czPxFvfWoUOFC2/1.png?size=600x800", -// ], -// fulfilledFragments: [] -// ), -// DataDict( -// data: [ -// "id": "2", -// "imageUrl": "https://asia-northeast1-bematch-staging.cloudfunctions.net/onRequestResizedImage/users/profile_images/vJ2NQU467OgyW6czPxFvfWoUOFC2/2.png?size=600x800", -// ], -// fulfilledFragments: [] -// ), -// ], -// ], -// fulfilledFragments: [] -// ) -// ) -// ), -// reducer: SwipeCardLogic.init -// ) -// ) -// .environment(\.colorScheme, .dark) -// } -// -// #Preview { -// SwipeCardView( -// store: .init( -// initialState: SwipeCardLogic.State( -// data: API.SwipeCard( -// _dataDict: DataDict( -// data: [ -// "id": "1", -// "images": [ -// DataDict( -// data: [ -// "id": "1", -// "imageUrl": "https://asia-northeast1-bematch-staging.cloudfunctions.net/onRequestResizedImage/users/profile_images/vJ2NQU467OgyW6czPxFvfWoUOFC2/1.png?size=600x800", -// ], -// fulfilledFragments: [] -// ), -// DataDict( -// data: [ -// "id": "2", -// "imageUrl": "https://asia-northeast1-bematch-staging.cloudfunctions.net/onRequestResizedImage/users/profile_images/vJ2NQU467OgyW6czPxFvfWoUOFC2/2.png?size=600x800", -// ], -// fulfilledFragments: [] -// ), -// ], -// ], -// fulfilledFragments: [] -// ) -// ) -// ), -// reducer: SwipeCardLogic.init -// ) -// ) -// .environment(\.colorScheme, .dark) -// } +#Preview { + SwipeCardView( + store: .init( + initialState: SwipeCardLogic.State( + data: API.SwipeCard( + _dataDict: DataDict( + data: [ + "id": "1", + "shortComment": DataDict( + data: [ + "id": "1", + "body": "生まれたからには世界中の人と仲良くなりたいです。近くに住んでいる人いたら教えてください。", + ], + fulfilledFragments: [] + ), + "images": [ + DataDict( + data: [ + "id": "1", + "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/4ACA05F5-6FA7-4E26-8595-15E0EF00A544.jpeg?size=408x408", + ], + fulfilledFragments: [] + ), + DataDict( + data: [ + "id": "2", + "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/675DD4EA-D968-4E0E-AC6C-37498A44061C.jpeg?size=408x408", + ], + fulfilledFragments: [] + ), + ], + ], + fulfilledFragments: [] + ) + ) + ), + reducer: SwipeCardLogic.init + ) + ) + .environment(\.colorScheme, .dark) +} + +#Preview { + SwipeCardView( + store: .init( + initialState: SwipeCardLogic.State( + data: API.SwipeCard( + _dataDict: DataDict( + data: [ + "id": "1", + "images": [ + DataDict( + data: [ + "id": "1", + "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/4ACA05F5-6FA7-4E26-8595-15E0EF00A544.jpeg?size=408x408", + ], + fulfilledFragments: [] + ), + DataDict( + data: [ + "id": "2", + "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/675DD4EA-D968-4E0E-AC6C-37498A44061C.jpeg?size=408x408", + ], + fulfilledFragments: [] + ), + ], + ], + fulfilledFragments: [] + ) + ) + ), + reducer: SwipeCardLogic.init + ) + ) + .environment(\.colorScheme, .dark) +} diff --git a/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf b/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf index f47a1aea..5ba6572c 100644 Binary files a/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf and b/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf differ diff --git a/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf b/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf index e89ac623..67d4eb18 100644 Binary files a/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf and b/Packages/PicMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf differ diff --git a/Packages/PicMatch/Sources/SwipeFeature/Swipe.swift b/Packages/PicMatch/Sources/SwipeFeature/Swipe.swift index da1343bf..4b870cc7 100644 --- a/Packages/PicMatch/Sources/SwipeFeature/Swipe.swift +++ b/Packages/PicMatch/Sources/SwipeFeature/Swipe.swift @@ -1,3 +1,4 @@ +import CachedAsyncImage import ComposableArchitecture import MatchedFeature import ReportFeature @@ -7,6 +8,7 @@ import SwipeCardFeature import SwipeLogic public struct SwipeView: View { + @Environment(\.displayScale) var displayScale let store: StoreOf public init(store: StoreOf) { @@ -14,45 +16,67 @@ public struct SwipeView: View { } public var body: some View { - VStack(spacing: 24) { - ZStack { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: SwipeCardView.init(store:) - ) - } + WithViewStore(store, observe: { $0 }) { viewStore in + VStack(spacing: 32) { + Spacer() - HStack(spacing: 40) { - Button { - store.send(.nopeButtonTapped) - } label: { - Image(ImageResource.xmark) - .resizable() - .frame(width: 56, height: 56) - .clipShape(Circle()) + ZStack { + ForEachStore( + store.scope(state: \.rows, action: \.rows), + content: SwipeCardView.init(store:) + ) } - Button { - store.send(.likeButtonTapped) - } label: { - Image(ImageResource.heart) - .resizable() - .frame(width: 56, height: 56) - .clipShape(Circle()) + HStack(spacing: 40) { + Button { + store.send(.nopeButtonTapped) + } label: { + Image(ImageResource.xmark) + .resizable() + .frame(width: 56, height: 56) + .clipShape(Circle()) + } + + Button { + store.send(.likeButtonTapped) + } label: { + Image(ImageResource.heart) + .resizable() + .frame(width: 56, height: 56) + .clipShape(Circle()) + } } - } - .buttonStyle(HoldDownButtonStyle()) + .buttonStyle(HoldDownButtonStyle()) - Spacer() - } - .padding(.top, 16) - .fullScreenCover( - store: store.scope(state: \.$destination.matched, action: \.destination.matched), - content: MatchedView.init(store:) - ) - .sheet(store: store.scope(state: \.$destination.report, action: \.destination.report)) { store in - NavigationStack { - ReportView(store: store) + Spacer() + } + .frame(maxWidth: .infinity) + .background { + CachedAsyncImage( + url: viewStore.backgroundCoverImageUrl, + urlCache: URLCache.shared, + scale: displayScale, + content: { content in + content + .resizable() + .aspectRatio(contentMode: .fill) + }, + placeholder: { + Color.black + } + ) + .blur(radius: 40) + .overlay(Color.black.opacity(0.8)) + } + .ignoresSafeArea() + .fullScreenCover( + store: store.scope(state: \.$destination.matched, action: \.destination.matched), + content: MatchedView.init(store:) + ) + .sheet(store: store.scope(state: \.$destination.report, action: \.destination.report)) { store in + NavigationStack { + ReportView(store: store) + } } } } diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/Contents.json b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/Contents.json deleted file mode 100644 index 86d7e1e0..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "busts-in-silhouette.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/busts-in-silhouette.svg b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/busts-in-silhouette.svg deleted file mode 100644 index 0df509f8..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/busts-in-silhouette.imageset/busts-in-silhouette.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/Contents.json b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/Contents.json deleted file mode 100644 index fb959022..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "coin.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/coin.svg b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/coin.svg deleted file mode 100644 index 500ebee1..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/coin.imageset/coin.svg +++ /dev/null @@ -1,266 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/Contents.json b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/Contents.json deleted file mode 100644 index 5a947487..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "locked.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/locked.svg b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/locked.svg deleted file mode 100644 index 4d85a513..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/locked.imageset/locked.svg +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/Contents.json b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/Contents.json deleted file mode 100644 index 8acd8e27..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "speech-balloon.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/speech-balloon.svg b/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/speech-balloon.svg deleted file mode 100644 index 44d0643c..00000000 --- a/Packages/PicMatch/Sources/TutorialFeature/Assets.xcassets/speech-balloon.imageset/speech-balloon.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Packages/PicMatch/Sources/TutorialFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/TutorialFeature/Localizable.xcstrings index 87e0d77e..1646f8dd 100644 --- a/Packages/PicMatch/Sources/TutorialFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/TutorialFeature/Localizable.xcstrings @@ -1,146 +1,362 @@ { "sourceLanguage" : "en", "strings" : { - "BeMatch is an application that allows you to exchange BeReal with everyone in Global!" : { + "Continue" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "続ける" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatch est une application qui vous permet d'échanger BeReal avec tout le monde dans le monde entier !" + "value" : "Continuer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "BeMatchは日本中のみんなとBeRealを交換できるアプリです" + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" } } } }, "Get started" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "さっそくはじめる" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시작하기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", "value" : "Commencer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "さっそくはじめる" + "value" : "Zacznij" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bắt đầu" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Empezar" } } } }, "Hmmm... left when" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "うーん...のときは左" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "흠... 언제 떠났나요?" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Hmmm... à gauche quand" + "value" : "Hmmm... gauche quand" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "うーん...のときは左" + "value" : "Hmmm... lewo, kiedy" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hmmm... bên trái khi" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hmmm... izquierda cuando" } } } }, "If you both Like each other, a match is made. Let's give it a try right away!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "お互いにLikeするとマッチが成立。早速試してみよう!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "두 사람이 서로 마음에 들면 매칭이 성사됩니다. 지금 바로 시도해 보세요!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Si vous vous aimez tous les deux, une correspondance est établie. Essayons-le tout de suite !" + "value" : "Si vous vous aimez tous les deux, une correspondance est faite. Essayons tout de suite!" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "お互いにLikeするとマッチが成立。早速試してみよう!" + "value" : "Jeśli oboje się lubicie, następuje dopasowanie. Wypróbujmy od razu!" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nếu cả hai bạn thích nhau, một cặp đôi được tạo ra. Hãy thử ngay thôi nào!" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si ambos se gustan, se forma una coincidencia. ¡Vamos a intentarlo de inmediato!" } } } }, "If you think, \"Maybe not...\", swipe left. If you think it's not quite right, swipe left." : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ちょっと違うかも...と思ったら、左にスワイプしよう。Nopeしたことは相手に伝わらないから大丈夫。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "“아닐 수도 있는데...”라고 생각되면 왼쪽으로 스와이프합니다.적절하지 않다고 생각되면 왼쪽으로 스와이프합니다." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Si vous pensez « Peut-être pas... », balayez vers la gauche. Si vous pensez que ce n'est pas tout à fait ça, balayez vers la gauche." + "value" : "Si vous pensez, « Peut-être pas... », balayez vers la gauche. Si vous pensez que ce n'est pas tout à fait ça, balayez vers la gauche." } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "ちょっと違うかも...と思ったら、左にスワイプしよう。Nopeしたことは相手に伝わらないから大丈夫。" + "value" : "Jeśli myślisz: „Może nie...”, przesuń palcem w lewo. Jeśli uważasz, że to nie do końca to, przesuń palcem w lewo." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nếu bạn nghĩ, \"Có lẽ không...\", hãy vuốt sang trái. Nếu bạn nghĩ rằng không đúng lắm, hãy vuốt sang trái." + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Si piensas: \"Quizás no...\", desliza hacia la izquierda. Si crees que no es del todo correcto, desliza hacia la izquierda." } } } }, "Let's get started!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "さっそくはじめよう!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "시작해보자!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Commençons !" + "value" : "Commençons!" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "さっそくはじめよう!" + "value" : "Zacznijmy!" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hãy bắt đầu nào!" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Vamos a empezar!" } } } }, - "Next" : { + "Right if you are interested!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "気になる人は右!" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "관심이 있으시다면 바로 그거예요!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Suivant" + "value" : "À droite si vous êtes intéressé!" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "次へ" + "value" : "W prawo, jeśli jesteś zainteresowany!" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vuốt sang phải nếu bạn quan tâm!" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡Derecha si estás interesado!" } } } }, - "Right if you are interested!" : { + "Skip" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "スキップ" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "건너뛰기" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "À droite si vous êtes intéressé !" + "value" : "Passer" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "気になる人は右!" + "value" : "Pomiń" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bỏ qua" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Saltar" } } } }, - "Skip" : { + "TenMatch is an application that allows you to exchange tenten with everyone in Global!" : { "localizations" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatchは日本中のみんなとtentenを交換できるアプリです" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "트링켓은 한국의 모든 사람들과 로켓을 교환할 수 있는 애플리케이션입니다!" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Passer" + "value" : "TenMatch est une application qui vous permet d'échanger tenten avec tout le monde dans le monde!" } }, - "ja" : { + "pl" : { "stringUnit" : { "state" : "translated", - "value" : "スキップ" + "value" : "TenMatch to aplikacja umożliwiająca wymianę tenten z wszystkimi na całym świecie!" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "TenMatch là một ứng dụng cho phép bạn trao đổi tenten với mọi người trên toàn cầu!" + } + }, + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "¡TenMatch es una aplicación que te permite intercambiar tenten con todos en el mundo!" } } } diff --git a/Packages/PicMatch/Sources/TutorialFeature/Step1.swift b/Packages/PicMatch/Sources/TutorialFeature/Step1.swift index a5ef439b..a87a06d1 100644 --- a/Packages/PicMatch/Sources/TutorialFeature/Step1.swift +++ b/Packages/PicMatch/Sources/TutorialFeature/Step1.swift @@ -11,7 +11,7 @@ struct Step1View: View { Text("Let's get started!", bundle: .module) .font(.system(.title, design: .rounded, weight: .bold)) - Text("BeMatch is an application that allows you to exchange BeReal with everyone in Global!", bundle: .module) + Text("TenMatch is an application that allows you to exchange tenten with everyone in Global!", bundle: .module) .font(.system(.headline, design: .rounded)) } .padding(.horizontal, 56) diff --git a/Packages/PicMatch/Sources/TutorialFeature/Tutorial.swift b/Packages/PicMatch/Sources/TutorialFeature/Tutorial.swift index 3ba0c059..bfac22d6 100644 --- a/Packages/PicMatch/Sources/TutorialFeature/Tutorial.swift +++ b/Packages/PicMatch/Sources/TutorialFeature/Tutorial.swift @@ -43,7 +43,7 @@ public struct TutorialView: View { if !viewStore.isNextButtonHidden { VStack(spacing: 24) { PrimaryButton( - String(localized: "Next", bundle: .module) + String(localized: "Continue", bundle: .module) ) { store.send(.nextButtonTapped, animation: .default) } diff --git a/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json index 8689b400..18ff4868 100644 --- a/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ b/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json @@ -1,7 +1,7 @@ { "images" : [ { - "filename" : "be-match.pdf", + "filename" : "TenMatch.pdf", "idiom" : "universal" } ], diff --git a/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf b/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf similarity index 100% rename from Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf rename to Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/TenMatch.pdf diff --git a/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf b/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf deleted file mode 100644 index 6ca1d065..00000000 Binary files a/Packages/PicMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/be-match.pdf and /dev/null differ diff --git a/Packages/PicMatch/Sources/UsernameSettingFeature/Localizable.xcstrings b/Packages/PicMatch/Sources/UsernameSettingFeature/Localizable.xcstrings index 04da2dba..81404505 100644 --- a/Packages/PicMatch/Sources/UsernameSettingFeature/Localizable.xcstrings +++ b/Packages/PicMatch/Sources/UsernameSettingFeature/Localizable.xcstrings @@ -4,83 +4,162 @@ "" : { }, - "BeRe.al/" : { + "By doing this, you agree\nto our [Privacy Policy](https://docs.tenmatch.app/privacy-policy) and [Terms of Use](https://docs.tenmatch.app/terms-of-use)." : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Al hacer esto, aceptas\nnuestra [Política de Privacidad](https://docs.tenmatch.app/privacy-policy) y [Términos de Uso](https://docs.tenmatch.app/terms-of-use)." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "BeRe.al/" + "value" : "En faisant cela, vous acceptez\nnotre [Politique de confidentialité](https://docs.tenmatch.app/privacy-policy) et nos [Conditions d'utilisation](https://docs.tenmatch.app/terms-of-use)." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeRe.al/" + "value" : "続けることで[プライバシーポリシー](https://docs.tenmatch.app/privacy-policy)および[利用規約](https://docs.tenmatch.app/terms-of-use)に同意するものとします。" } - } - } - }, - "By entering your username you agree to our [Terms](https://docs.bematch.jp/terms-of-use) and [Privacy Policy](https://docs.bematch.jp/privacy-policy)" : { - "localizations" : { - "fr" : { + }, + "ko" : { "stringUnit" : { "state" : "translated", - "value" : "En entrant votre nom d'utilisateur, vous acceptez nos [Conditions d'utilisation](https://docs.bematch.jp/terms-of-use) et notre [Politique de confidentialité](https://docs.bematch.jp/privacy-policy)" + "value" : "이렇게 하면 [개인정보 처리방침](https://docs.tenmatch.app/privacy-policy) 및 [이용약관](https://docs.tenmatch.app/terms-of-use)에 동의하는 것으로 간주됩니다." } }, - "ja" : { + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Postępując w ten sposób, zgadzasz się\nna naszą [Politykę Prywatności](https://docs.tenmatch.app/privacy-policy) oraz [Warunki Użytkowania](https://docs.tenmatch.app/terms-of-use)." + } + }, + "vi" : { "stringUnit" : { "state" : "translated", - "value" : "この操作を行うと、私たちの[プライバシーポリシー](https://docs.bematch.jp/privacy-policy)と[利用規約](https://docs.bematch.jp/terms-of-use)に同意したことになります。" + "value" : "Bằng cách này, bạn đồng ý với\n[Chính sách quyền riêng tư](https://docs.tenmatch.app/privacy-policy) và [Điều khoản sử dụng](https://docs.tenmatch.app/terms-of-use) của chúng tôi." } } } }, - "Next" : { + "Continue" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Continuar" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Suivant" + "value" : "Continuer" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "つぎへ" + "value" : "続ける" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "계속" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontynuuj" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tiếp tục" } } } }, - "Save" : { - "extractionState" : "manual", + "ex. du9v5pq" : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "p. ej. du9v5pq" + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Enregistrer" + "value" : "ex. du9v5pq" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "保存する" + "value" : "例: du9v5pq" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "예: du9v5pq" + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "np. du9v5pq" + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "ví dụ: du9v5pq" } } } }, - "What's your username on BeReal?" : { + "Please tell me your\ntenten PIN." : { "localizations" : { + "es" : { + "stringUnit" : { + "state" : "translated", + "value" : "Por favor, dime tu\nPIN de tenten." + } + }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Quel est votre nom d'utilisateur sur BeReal?" + "value" : "S'il vous plaît dites-moi votre\nPIN de tenten." } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "BeRealのユーザーネーム\nを教えてください" + "value" : "tentenのPINを教えてください。" + } + }, + "ko" : { + "stringUnit" : { + "state" : "translated", + "value" : "tenten PIN을 알려주세요." + } + }, + "pl" : { + "stringUnit" : { + "state" : "translated", + "value" : "Proszę powiedz mi swój\nPIN tenten." + } + }, + "vi" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vui lòng cho tôi biết PIN của bạn\ntrên tenten." } } } diff --git a/Packages/PicMatch/Sources/UsernameSettingFeature/UsernameSetting.swift b/Packages/PicMatch/Sources/UsernameSettingFeature/UsernameSetting.swift index d884bf1a..c888319c 100644 --- a/Packages/PicMatch/Sources/UsernameSettingFeature/UsernameSetting.swift +++ b/Packages/PicMatch/Sources/UsernameSettingFeature/UsernameSetting.swift @@ -4,60 +4,50 @@ import SwiftUI import UsernameSettingLogic public struct UsernameSettingView: View { - public enum NextButtonStyle: Equatable { - case next - case save - } - @FocusState var isFocused: Bool let store: StoreOf - private let nextButtonStyle: NextButtonStyle public init( - store: StoreOf, - nextButtonStyle: NextButtonStyle + store: StoreOf ) { self.store = store - self.nextButtonStyle = nextButtonStyle } public var body: some View { WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 32) { - Text("What's your username on BeReal?", bundle: .module) - .frame(height: 50) - .font(.system(.title3, weight: .semibold)) - - VStack(spacing: 0) { - Text("BeRe.al/", bundle: .module) - .foregroundStyle(Color.gray) - .hidden() - - TextField("", text: viewStore.$value) - .foregroundStyle(Color.white) - .keyboardType(.alphabet) - .textInputAutocapitalization(.never) - .autocorrectionDisabled() - .focused($isFocused) - } - .font(.system(.title3, weight: .semibold)) + VStack(spacing: 16) { + Text("Please tell me your\ntenten PIN.", bundle: .module) + .font(.system(.title2, weight: .bold)) - Text("By entering your username you agree to our [Terms](https://docs.bematch.jp/terms-of-use) and [Privacy Policy](https://docs.bematch.jp/privacy-policy)", bundle: .module) - .font(.system(.caption)) + Text("ex. du9v5pq", bundle: .module) + .font(.system(.caption, design: .rounded)) + .tint(Color.gray) .foregroundStyle(Color.gray) + TextField("", text: viewStore.$value) + .foregroundStyle(Color.white) + .textInputAutocapitalization(.never) + .autocorrectionDisabled() + .frame(height: 56) + .focused($isFocused) + .background(Color(uiColor: UIColor.systemFill)) + .font(.system(.title3, design: .rounded, weight: .semibold)) + .clipShape(RoundedRectangle(cornerRadius: 12)) + Spacer() + Text("By doing this, you agree\nto our [Privacy Policy](https://docs.tenmatch.app/privacy-policy) and [Terms of Use](https://docs.tenmatch.app/terms-of-use).", bundle: .module) + .font(.system(.caption, design: .rounded)) + .foregroundStyle(Color.gray) + PrimaryButton( - nextButtonStyle == .save - ? String(localized: "Save", bundle: .module) - : String(localized: "Next", bundle: .module), + String(localized: "Continue", bundle: .module), isLoading: viewStore.isActivityIndicatorVisible ) { store.send(.nextButtonTapped) } } - .padding(.top, 24) + .padding(.top, 32) .padding(.bottom, 16) .padding(.horizontal, 16) .multilineTextAlignment(.center) @@ -86,8 +76,7 @@ public struct UsernameSettingView: View { username: "" ), reducer: { UsernameSettingLogic() } - ), - nextButtonStyle: .next + ) ) } .environment(\.colorScheme, .dark) diff --git a/Packages/TenMatch/Sources/AchievementFeature/Achievement.swift b/Packages/TenMatch/Sources/AchievementFeature/Achievement.swift deleted file mode 100644 index bfb42ee9..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/Achievement.swift +++ /dev/null @@ -1,56 +0,0 @@ -import AchievementLogic -import ComposableArchitecture -import SwiftUI - -public struct AchievementView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .content: - CaseLet( - /AchievementLogic.State.content, - action: AchievementLogic.Action.content, - then: AchievementContentView.init(store:) - ) - } - } - .navigationTitle(String(localized: "Achievement", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } -} - -#Preview { - NavigationStack { - AchievementView( - store: .init( - initialState: AchievementLogic.State.loading, - reducer: { AchievementLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/AchievementFeature/AchievementContent.swift b/Packages/TenMatch/Sources/AchievementFeature/AchievementContent.swift deleted file mode 100644 index 1454b46b..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/AchievementContent.swift +++ /dev/null @@ -1,69 +0,0 @@ -import AchievementLogic -import ComposableArchitecture -import SwiftUI - -public struct AchievementContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ScrollView { - Grid( - horizontalSpacing: 16, - verticalSpacing: 16 - ) { -// GridRow(alignment: .top) { -// AchievementRatingWidgetView() -// } -// .gridCellColumns(2) - - GridRow(alignment: .top) { - AchievementWidgetView( - systemImage: "heart.fill", - titleKey: "SWIPE", - displayCount: viewStore.displayFeedbackCount, - text: String(localized: "Count of swipes", bundle: .module) - ) - - AchievementWidgetView( - systemImage: "star.fill", - titleKey: "MATCH", - displayCount: viewStore.displayMatchCount, - text: String(localized: "Count of match", bundle: .module) - ) - } - - GridRow(alignment: .top) { - AchievementWidgetView( - systemImage: "airplane", - titleKey: "VISITOR", - displayCount: viewStore.displayVisitCount, - text: String(localized: "Count of visitor", bundle: .module) - ) - -// AchievementWidgetView( -// systemImage: "flame.fill", -// titleKey: "LOGIN", -// displayCount: viewStore.displayConsecutiveLoginDayCount, -// text: "Consecutive login" -// ) - } - - GridRow(alignment: .top) { - IfLetStore( - store.scope(state: \.history, action: \.history), - then: AchievementHistoryWidgetView.init(store:) - ) - } - } - .padding(.top, 16) - .padding(.horizontal, 16) - .padding(.bottom, 80) - } - } - } -} diff --git a/Packages/TenMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift b/Packages/TenMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift deleted file mode 100644 index 404a9faf..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/AchievementHistoryWidget.swift +++ /dev/null @@ -1,36 +0,0 @@ -import AchievementLogic -import ComposableArchitecture -import SwiftUI - -public struct AchievementHistoryWidgetView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(alignment: .leading, spacing: 0) { - Label("HISTORY", systemImage: "calendar") - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - - HStack(alignment: .bottom, spacing: 8) { - Text(viewStore.displayDaysAgo) - .font(.system(size: 64, weight: .semibold, design: .rounded)) - - Text("days.", bundle: .module) - .font(.system(size: 32, weight: .semibold, design: .rounded)) - .padding(.bottom, 8) - } - - Text(viewStore.displayCreationDate) - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.vertical, 16) - } - } -} diff --git a/Packages/TenMatch/Sources/AchievementFeature/AchievementRatingWidget.swift b/Packages/TenMatch/Sources/AchievementFeature/AchievementRatingWidget.swift deleted file mode 100644 index 0f1c784e..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/AchievementRatingWidget.swift +++ /dev/null @@ -1,40 +0,0 @@ -import SwiftUI - -struct AchievementRatingWidgetView: View { - var body: some View { - VStack(alignment: .leading, spacing: 8) { - Text("RATING", bundle: .module) - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - - HStack(spacing: 8) { - ForEach(0 ..< 5) { _ in - Image(systemName: "star.fill") - .font(.system(size: 40)) - } - } - .foregroundStyle(Color.yellow) - - VStack(alignment: .leading, spacing: 0) { - Text("Top") - .font(.system(size: 20, weight: .semibold, design: .rounded)) - Text("0.1%") - .font(.system(size: 64, weight: .semibold, design: .rounded)) - } - - Text("Count of swipes across Japan", bundle: .module) - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.vertical, 16) - .padding(.horizontal, 12) - } -} - -#Preview { - NavigationStack { - AchievementRatingWidgetView() - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/AchievementFeature/AchievementWidget.swift b/Packages/TenMatch/Sources/AchievementFeature/AchievementWidget.swift deleted file mode 100644 index 93a37b5e..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/AchievementWidget.swift +++ /dev/null @@ -1,25 +0,0 @@ -import SwiftUI - -struct AchievementWidgetView: View { - let systemImage: String - let titleKey: LocalizedStringKey - let displayCount: String - let text: String - - var body: some View { - VStack(alignment: .leading, spacing: 0) { - Label(titleKey, systemImage: systemImage) - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - - Text(displayCount) - .font(.system(size: 64, weight: .semibold, design: .rounded)) - - Text(text) - .foregroundStyle(Color.secondary) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(maxWidth: .infinity, alignment: .leading) - .padding(.vertical, 16) - } -} diff --git a/Packages/TenMatch/Sources/AchievementFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/AchievementFeature/Localizable.xcstrings deleted file mode 100644 index 66c5b1a2..00000000 --- a/Packages/TenMatch/Sources/AchievementFeature/Localizable.xcstrings +++ /dev/null @@ -1,514 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "0.1%" : { - "localizations" : { - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "0.1%" - } - }, - "fr" : { - "stringUnit" : { - "state" : "new", - "value" : "0,1%" - } - }, - "pl" : { - "stringUnit" : { - "state" : "new", - "value" : "0,1%" - } - }, - "vi" : { - "stringUnit" : { - "state" : "new", - "value" : "0,1%" - } - }, - "es" : { - "stringUnit" : { - "state" : "new", - "value" : "0,1%" - } - } - } - }, - "Achievement" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アチーブメント" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업적" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Réussite" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Osiągnięcie" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thành tựu" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Logro" - } - } - } - }, - "Count of match" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マッチした数" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "매치 수" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de correspondances" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liczba dopasowań" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Số lần ghép đôi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cantidad de coincidencias" - } - } - } - }, - "Count of swipes" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スワイプした数" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "스와이프 수" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de balayages" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liczba przesunięć" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Số lần vuốt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cantidad de deslizamientos" - } - } - } - }, - "Count of swipes across Japan" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "日本全体でのスワイプ数" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "일본 전역의 스와이프 수" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de balayages à travers le Japon" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liczba przesunięć w całej Japonii" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Số lần vuốt trên khắp Nhật Bản" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cantidad de deslizamientos en todo Japón" - } - } - } - }, - "Count of visitor" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィールを見られた数" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "방문자 수" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de visiteurs" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liczba odwiedzających" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Số lượng khách truy cập" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cantidad de visitantes" - } - } - } - }, - "days." : { - "localizations" : { - "ko" : { - "stringUnit" : { - "state" : "new", - "value" : "일." - } - }, - "fr" : { - "stringUnit" : { - "state" : "new", - "value" : "jours." - } - }, - "pl" : { - "stringUnit" : { - "state" : "new", - "value" : "dni." - } - }, - "vi" : { - "stringUnit" : { - "state" : "new", - "value" : "ngày." - } - }, - "es" : { - "stringUnit" : { - "state" : "new", - "value" : "días." - } - } - } - }, - "HISTORY" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "HISTORY" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "HISTORY" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "HISTORIQUE" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "HISTORIA" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "LỊCH SỬ" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "HISTORIA" - } - } - } - }, - "MATCH" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "MATCH" - } - } - } - }, - "RATING" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "RATING" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "RATING" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "NOTE" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "OCENA" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "ĐÁNH GIÁ" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "VALORACIÓN" - } - } - } - }, - "SWIPE" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "SWIPE" - } - } - } - }, - "Top" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Top" - } - } - } - }, - "VISITOR" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "VISITOR" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "VISITOR" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "VISITEUR" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "ODWIEDZAJĄCY" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "KHÁCH THĂM QUAN" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "VISITANTE" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/AppFeature/AppLogic.swift b/Packages/TenMatch/Sources/AppFeature/AppLogic.swift deleted file mode 100644 index a56b298f..00000000 --- a/Packages/TenMatch/Sources/AppFeature/AppLogic.swift +++ /dev/null @@ -1,90 +0,0 @@ -import AppLogic -import BannedFeature -import ComposableArchitecture -import ForceUpdateFeature -import FreezedFeature -import LaunchFeature -import MaintenanceFeature -import NavigationFeature -import NetworkErrorFeature -import OnboardFeature -import ReceivedLikeRouterFeature -import SwiftUI -import TutorialFeature - -public struct AppView: View { - @Environment(\.scenePhase) private var scenePhase - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .launch: - CaseLet( - /AppLogic.Child.State.launch, - action: AppLogic.Child.Action.launch, - then: LaunchView.init(store:) - ) - case .onboard: - CaseLet( - /AppLogic.Child.State.onboard, - action: AppLogic.Child.Action.onboard, - then: OnboardView.init(store:) - ) - case .navigation: - CaseLet( - /AppLogic.Child.State.navigation, - action: AppLogic.Child.Action.navigation, - then: RootNavigationView.init(store:) - ) - case .forceUpdate: - CaseLet( - /AppLogic.Child.State.forceUpdate, - action: AppLogic.Child.Action.forceUpdate, - then: ForceUpdateView.init(store:) - ) - case .maintenance: - CaseLet( - /AppLogic.Child.State.maintenance, - action: AppLogic.Child.Action.maintenance, - then: MaintenanceView.init(store:) - ) - case .banned: - CaseLet( - /AppLogic.Child.State.banned, - action: AppLogic.Child.Action.banned, - then: BannedView.init(store:) - ) - case .freezed: - CaseLet( - /AppLogic.Child.State.freezed, - action: AppLogic.Child.Action.freezed, - then: FreezedView.init(store:) - ) - case .networkError: - CaseLet( - /AppLogic.Child.State.networkError, - action: AppLogic.Child.Action.networkError, - then: NetworkErrorView.init(store:) - ) - } - } - .onChange(of: scenePhase) { _ in - store.send(.scenePhaseChanged(scenePhase)) - } - .overlay { - IfLetStore( - store.scope(state: \.tutorial, action: \.tutorial), - then: TutorialView.init(store:) - ) - } - .fullScreenCover( - store: store.scope(state: \.$destination.receivedLike, action: \.destination.receivedLike), - content: ReceivedLikeRouterView.init(store:) - ) - } -} diff --git a/Packages/TenMatch/Sources/BannedFeature/Banned.swift b/Packages/TenMatch/Sources/BannedFeature/Banned.swift deleted file mode 100644 index 217251b5..00000000 --- a/Packages/TenMatch/Sources/BannedFeature/Banned.swift +++ /dev/null @@ -1,58 +0,0 @@ -import BannedLogic -import ComposableArchitecture -import SwiftUI - -public struct BannedView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 24) { - Spacer() - - Text("Your account has been banned from TenMatch.", bundle: .module) - .font(.system(.headline, design: .rounded, weight: .semibold)) - - Text("It's important to us that TenMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.tenmatch.app/terms-of-use) and so we've made the decision to remove you from the TenMatch Platform.", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - - Text("You will no longer be able to access your TenMatch account or create new accounts in the future.", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - - Text("id: \(viewStore.userId)") - .font(.system(.body, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - - Spacer() - - Text("Please note that if you are subscribed to any premium services through the App Store, you will need to cancel your subscription with the appropriate provider.", bundle: .module) - .font(.system(.caption, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - } - .padding(.horizontal, 16) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background() - .multilineTextAlignment(.center) - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - BannedView( - store: .init( - initialState: BannedLogic.State( - userId: "71ff7640-cbad-4d50-9c10-ac07910a075d" - ), - reducer: { BannedLogic() } - ) - ) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/BannedFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/BannedFeature/Localizable.xcstrings deleted file mode 100644 index 3ee33b50..00000000 --- a/Packages/TenMatch/Sources/BannedFeature/Localizable.xcstrings +++ /dev/null @@ -1,206 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "id: %@" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "id: %@" - } - } - } - }, - "It's important to us that TenMatch is a welcoming and safe space for everyone.\nUnfortunately, we found that you violated our [Terms of Use](https://docs.tenmatch.app/terms-of-use) and so we've made the decision to remove you from the TenMatch Platform." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatchでは、すべての人にとって安心で安全な場所であることを重視しています。残念ながらあなたの行為が[利用規約](https://docs.tenmatch.app/terms-of-use)に違反したことが判明したため、当社はあなたをTenMatchのプラットフォームから削除することを決定しました。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch은 모든 사람에게 환영받고 안전한 공간이 되는 것이 중요합니다. 안타깝게도 귀하가 당사의 [이용 약관](https://docs.tenmatch.app/terms-of-use)을 위반한 사실이 발견되어 귀하를 TenMatch 플랫폼에서 삭제하기로 결정했습니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il est important pour nous que TenMatch soit un espace accueillant et sûr pour tout le monde. Malheureusement, nous avons constaté que vous avez violé nos [Conditions d'utilisation](https://docs.tenmatch.app/terms-of-use) et avons donc pris la décision de vous retirer de la plateforme TenMatch." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dla nas ważne jest, aby TenMatch było przyjaznym i bezpiecznym miejscem dla każdego. Niestety stwierdziliśmy, że naruszyłeś nasze [Warunki użytkowania](https://docs.tenmatch.app/terms-of-use), dlatego podjęliśmy decyzję o usunięciu Cię z platformy TenMatch." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Điều quan trọng đối với chúng tôi là TenMatch là một không gian chào đón và an toàn cho mọi người. Thật không may, chúng tôi nhận thấy rằng bạn đã vi phạm [Điều khoản Sử dụng](https://docs.tenmatch.app/terms-of-use) của chúng tôi và do đó, chúng tôi đã quyết định xóa bạn khỏi Nền tảng TenMatch." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Es importante para nosotros que TenMatch sea un espacio acogedor y seguro para todos. Desafortunadamente, encontramos que has violado nuestros [Términos de uso](https://docs.tenmatch.app/terms-of-use) y por lo tanto hemos tomado la decisión de eliminarte de la plataforma TenMatch." - } - } - } - }, - "Please note that if you are subscribed to any premium services through the App Store, you will need to cancel your subscription with the appropriate provider." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Storeを通じて購読している場合は、App Storeで解約する必要がありますのでご注意ください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store를 통해 프리미엄 서비스를 구독한 경우 해당 제공업체를 통해 구독을 취소해야 합니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Veuillez noter que si vous êtes abonné à des services premium via l'App Store, vous devrez annuler votre abonnement auprès du fournisseur approprié." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Należy pamiętać, że jeśli subskrybujesz jakiekolwiek usługi premium przez App Store, musisz anulować subskrypcję u odpowiedniego dostawcy." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vui lòng lưu ý rằng nếu bạn đã đăng ký bất kỳ dịch vụ cao cấp nào thông qua App Store, bạn sẽ cần hủy đăng ký của mình với nhà cung cấp phù hợp." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ten en cuenta que si estás suscrito a cualquier servicio premium a través de la App Store, deberás cancelar tu suscripción con el proveedor correspondiente." - } - } - } - }, - "You will no longer be able to access your TenMatch account or create new accounts in the future." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "あなたは今後、TenMatchのアカウントにアクセスしたり、新しいアカウントを作成することは出来ません。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "더 이상 TenMatch 계정에 액세스하거나 새 계정을 만들 수 없습니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous ne pourrez plus accéder à votre compte TenMatch ni créer de nouveaux comptes à l'avenir." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie będziesz już mieć dostępu do swojego konta TenMatch ani tworzyć nowych kont w przyszłości." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạn sẽ không thể truy cập tài khoản TenMatch của mình hoặc tạo tài khoản mới trong tương lai." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ya no podrás acceder a tu cuenta de TenMatch ni crear nuevas cuentas en el futuro." - } - } - } - }, - "Your account has been banned from TenMatch." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "あなたのTenMatchアカウントは利用停止されました。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "귀하의 TenMatch 계정이 정지되었습니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Votre compte a été banni de TenMatch." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twoje konto zostało zbanowane na TenMatch." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tài khoản của bạn đã bị cấm khỏi TenMatch." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tu cuenta ha sido prohibida en TenMatch." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/BannerFeature/Banner.swift b/Packages/TenMatch/Sources/BannerFeature/Banner.swift deleted file mode 100644 index 4566bc58..00000000 --- a/Packages/TenMatch/Sources/BannerFeature/Banner.swift +++ /dev/null @@ -1,69 +0,0 @@ -import API -import BannerLogic -import ComposableArchitecture -import Styleguide -import SwiftUI - -public struct BannerView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 8) { - Text(viewStore.banner.title) - .font(.system(.footnote, design: .rounded, weight: .semibold)) - - if let description = viewStore.banner.description { - Text(description) - .font(.system(.caption)) - } - - Button { - store.send(.bannerButtonTapped) - } label: { - Text(viewStore.banner.buttonTitle) - .font(.system(.caption2, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.black) - .frame(height: 38) - .frame(maxWidth: .infinity) - .background(Color.white) - .cornerRadius(12) - } - } - .padding(.all, 16) - .frame(maxWidth: .infinity) - .multilineTextAlignment(.center) - .background(Color(uiColor: UIColor.secondarySystemBackground)) - .cornerRadius(12) - } - } -} - -#Preview { - BannerView( - store: .init( - initialState: BannerLogic.State( - banner: API.BannerCard( - _dataDict: DataDict( - data: [ - "id": "id", - "title": "TenMatchの社長と話そう", - "description": "アプリの改善策や不具合などあれば教えてください。", - "buttonTitle": "開く", - "url": "https://tenmatch.app", - "startAt": 10, - "endAt": 10, - ], - fulfilledFragments: [] - ) - ) - ), - reducer: { BannerLogic() } - ) - ) - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/Contents.json b/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/Contents.json deleted file mode 100644 index 08da8a12..00000000 --- a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "empty.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/empty.pdf b/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/empty.pdf deleted file mode 100644 index 5fd7c8fc..00000000 Binary files a/Packages/TenMatch/Sources/CategoryEmptyFeature/Assets.xcassets/empty.imageset/empty.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift b/Packages/TenMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift deleted file mode 100644 index f2795c36..00000000 --- a/Packages/TenMatch/Sources/CategoryEmptyFeature/CategoryEmpty.swift +++ /dev/null @@ -1,46 +0,0 @@ -import CategoryEmptyLogic -import ComposableArchitecture -import Styleguide -import SwiftUI - -public struct CategoryEmptyView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { _ in - VStack(spacing: 24) { - Image(ImageResource.empty) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 120) - - Text("Looks like he's gone.", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - PrimaryButton( - String(localized: "Swipe others", bundle: .module) - ) { - store.send(.emptyButtonTapped) - } - } - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - } - } -} - -#Preview { - NavigationStack { - CategoryEmptyView( - store: .init( - initialState: CategoryEmptyLogic.State(), - reducer: { CategoryEmptyLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings deleted file mode 100644 index c654cfcd..00000000 --- a/Packages/TenMatch/Sources/CategoryEmptyFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Looks like he's gone." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "もういないみたい..." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "그는 사라진 것 같아..." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "On dirait qu'il est parti..." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wygląda na to, że go nie ma..." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Có vẻ như anh ấy đã đi rồi..." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Parece que se ha ido..." - } - } - } - }, - "Swipe others" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "他の人をスワイプする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "다른 사람들을 스와이프" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Swiper d'autres personnes" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przesuń innych" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt người khác" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desliza a otros" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/CategoryFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategoryFeature/Category.swift b/Packages/TenMatch/Sources/CategoryFeature/Category.swift deleted file mode 100644 index f3607a56..00000000 --- a/Packages/TenMatch/Sources/CategoryFeature/Category.swift +++ /dev/null @@ -1,54 +0,0 @@ -import CategoryEmptyFeature -import CategoryListFeature -import CategoryLogic -import ComposableArchitecture -import SwiftUI - -public struct CategoryView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStack { - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - case .empty: - CaseLet( - /CategoryLogic.Child.State.empty, - action: CategoryLogic.Child.Action.empty, - then: CategoryEmptyView.init(store:) - ) - case .list: - CaseLet( - /CategoryLogic.Child.State.list, - action: CategoryLogic.Child.Action.list, - then: CategoryListView.init(store:) - ) - } - } - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .alert(store: store.scope(state: \.$alert, action: \.alert)) - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} - -#Preview { - CategoryView( - store: .init( - initialState: CategoryLogic.State(), - reducer: { CategoryLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/CategoryListFeature/CategoryList.swift b/Packages/TenMatch/Sources/CategoryListFeature/CategoryList.swift deleted file mode 100644 index ddf26dc1..00000000 --- a/Packages/TenMatch/Sources/CategoryListFeature/CategoryList.swift +++ /dev/null @@ -1,37 +0,0 @@ -import CategoryListLogic -import CategorySwipeFeature -import ComposableArchitecture -import MembershipFeature -import SwiftUI - -public struct CategoryListView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - ScrollView(.vertical) { - LazyVStack(spacing: 16) { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: CategorySectionView.init(store:) - ) - } - .padding(.top, 16) - .padding(.bottom, 48) - } - .fullScreenCover( - store: store.scope(state: \.$destination.swipe, action: \.destination.swipe) - ) { store in - NavigationStack { - CategorySwipeView(store: store) - } - } - .fullScreenCover( - store: store.scope(state: \.$destination.membership, action: \.destination.membership), - content: MembershipView.init(store:) - ) - } -} diff --git a/Packages/TenMatch/Sources/CategoryListFeature/CategoryRow.swift b/Packages/TenMatch/Sources/CategoryListFeature/CategoryRow.swift deleted file mode 100644 index 37a5c559..00000000 --- a/Packages/TenMatch/Sources/CategoryListFeature/CategoryRow.swift +++ /dev/null @@ -1,61 +0,0 @@ -import CachedAsyncImage -import CategoryListLogic -import ComposableArchitecture -import Styleguide -import SwiftUI - -public struct CategoryRowView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - var goldGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped) - } label: { - CachedAsyncImage( - url: URL(string: viewStore.user.images[0].imageUrl), - urlCache: URLCache.shared, - scale: displayScale - ) { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: 144, height: 192) - } placeholder: { - Color.black - .frame(width: 144, height: 192) - .overlay { - ProgressView() - .tint(Color.white) - } - } - .blur(radius: viewStore.isBlur ? 18 : 0) - .clipShape(RoundedRectangle(cornerRadius: 8)) - .overlay { - if viewStore.isBlur { - RoundedRectangle(cornerRadius: 8) - .stroke(goldGradient, lineWidth: 3) - } - } - .padding(.vertical, 2) - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/TenMatch/Sources/CategoryListFeature/CategorySection.swift b/Packages/TenMatch/Sources/CategoryListFeature/CategorySection.swift deleted file mode 100644 index abc6c5c6..00000000 --- a/Packages/TenMatch/Sources/CategoryListFeature/CategorySection.swift +++ /dev/null @@ -1,32 +0,0 @@ -import CategoryListLogic -import ComposableArchitecture -import SwiftUI - -public struct CategorySectionView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(alignment: .leading, spacing: 8) { - Text(viewStore.userCategory.title) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - .padding(.horizontal, 16) - - ScrollView(.horizontal, showsIndicators: false) { - LazyHStack(spacing: 8) { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: CategoryRowView.init(store:) - ) - } - .padding(.horizontal, 16) - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/Contents.json b/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/Contents.json deleted file mode 100644 index 36798f70..00000000 --- a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "heart.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/heart.pdf b/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/heart.pdf deleted file mode 100644 index f47a1aea..00000000 Binary files a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/heart.imageset/heart.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/Contents.json b/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/Contents.json deleted file mode 100644 index 41b779d8..00000000 --- a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "xmark.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf b/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf deleted file mode 100644 index e89ac623..00000000 Binary files a/Packages/TenMatch/Sources/CategorySwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/CategorySwipeFeature/CategorySwipe.swift b/Packages/TenMatch/Sources/CategorySwipeFeature/CategorySwipe.swift deleted file mode 100644 index cf7ac654..00000000 --- a/Packages/TenMatch/Sources/CategorySwipeFeature/CategorySwipe.swift +++ /dev/null @@ -1,62 +0,0 @@ -import CategoryEmptyFeature -import CategorySwipeLogic -import ComposableArchitecture -import MatchedFeature -import ReportFeature -import Styleguide -import SwiftUI -import SwipeCardFeature -import SwipeFeature - -public struct CategorySwipeView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .swipe: - CaseLet( - /CategorySwipeLogic.Child.State.swipe, - action: CategorySwipeLogic.Child.Action.swipe, - then: SwipeView.init(store:) - ) - .padding(.horizontal, 16) - case .empty: - CaseLet( - /CategorySwipeLogic.Child.State.empty, - action: CategorySwipeLogic.Child.Action.empty, - then: CategoryEmptyView.init(store:) - ) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background( - LinearGradient( - colors: viewStore.colors, - startPoint: UnitPoint.top, - endPoint: UnitPoint.bottom - ) - ) - .navigationTitle(viewStore.title) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "chevron.down") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/DeleteAccountFeature/DeleteAccount.swift b/Packages/TenMatch/Sources/DeleteAccountFeature/DeleteAccount.swift deleted file mode 100644 index 3fb04bfb..00000000 --- a/Packages/TenMatch/Sources/DeleteAccountFeature/DeleteAccount.swift +++ /dev/null @@ -1,114 +0,0 @@ -import ComposableArchitecture -import DeleteAccountLogic -import Styleguide -import SwiftUI - -public struct DeleteAccountView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 8) { - Text("Are you sure you want to delete your account?", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - - Text("This **cannot** be undone or recovered.", bundle: .module) - - List { - ForEach(viewStore.reasons, id: \.self) { reason in - Button { - store.send(.reasonButtonTapped(reason)) - } label: { - LabeledContent { - if viewStore.selectedReasons.contains(reason) { - Image(systemName: "checkmark.circle") - } - } label: { - Text(reason) - .foregroundStyle(Color.white) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(height: 50) - } - .id(reason) - } - - TextField( - String(localized: "Other Reason", bundle: .module), - text: viewStore.$otherReason, - axis: .vertical - ) - .lineLimit(1 ... 10) - .frame(minHeight: 54) - .padding(.horizontal, 16) - .multilineTextAlignment(.leading) - .id("other") - } - .scrollDisabled(true) - - PrimaryButton( - String(localized: "Proceed with Deletion", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.isActivityIndicatorVisible - ) { - store.send(.deleteButtonTapped) - } - .padding(.horizontal, 16) - - Button { - store.send(.notNowButtonTapped) - } label: { - Text("Not Now", bundle: .module) - .frame(height: 50) - .foregroundStyle(Color.white) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - } - } - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Text("Delete Account", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - } - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .bold() - .foregroundStyle(Color.white) - } - .buttonStyle(HoldDownButtonStyle()) - } - } - .alert( - store: store.scope(state: \.$destination.alert, action: \.destination.alert) - ) - .confirmationDialog( - store: store.scope( - state: \.$destination.confirmationDialog, - action: \.destination.confirmationDialog - ) - ) - } - } -} - -#Preview { - NavigationStack { - DeleteAccountView( - store: .init( - initialState: DeleteAccountLogic.State(), - reducer: { DeleteAccountLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/DeleteAccountFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/DeleteAccountFeature/Localizable.xcstrings deleted file mode 100644 index f38b9b0e..00000000 --- a/Packages/TenMatch/Sources/DeleteAccountFeature/Localizable.xcstrings +++ /dev/null @@ -1,246 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Are you sure you want to delete your account?" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "本当にアカウントを削除しますか?" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정말로 계정을 삭제하시겠습니까?" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Êtes-vous sûr de vouloir supprimer votre compte ?" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Czy na pewno chcesz usunąć swoje konto?" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạn có chắc chắn muốn xóa tài khoản của mình không?" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¿Estás seguro de que deseas eliminar tu cuenta?" - } - } - } - }, - "Delete Account" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウント削除" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 삭제" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer le compte" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuń konto" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xóa tài khoản" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Eliminar cuenta" - } - } - } - }, - "Not Now" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "今はしない" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "지금은 아니오" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pas maintenant" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie teraz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Không phải bây giờ" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No ahora" - } - } - } - }, - "Other Reason" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他の理由" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "다른 이유" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autre raison" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inny powód" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lý do khác" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otra razón" - } - } - } - }, - "Proceed with Deletion" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "削除する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "삭제 진행" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Procéder à la suppression" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przejdź do usunięcia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiến hành xóa" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proceder con la eliminación" - } - } - } - }, - "This **cannot** be undone or recovered." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "これを元に戻したり、回復したりすることは**出来ません**。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이것은 **되돌릴 수** 없거나 복구할 수 없습니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cela **ne peut pas** être annulé ou récupéré." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tego **nie można** cofnąć ani odzyskać." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Điều này **không thể** được hoàn tác hoặc khôi phục." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Esto **no** se puede deshacer ni recuperar." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/Contents.json b/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/Contents.json deleted file mode 100644 index e992ef35..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "yes.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/yes.pdf b/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/yes.pdf deleted file mode 100644 index 12b11bd9..00000000 Binary files a/Packages/TenMatch/Sources/DirectMessageFeature/Assets.xcassets/yes.imageset/yes.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessage.swift b/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessage.swift deleted file mode 100644 index cec2a080..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessage.swift +++ /dev/null @@ -1,52 +0,0 @@ -import ComposableArchitecture -import DirectMessageLogic -import ReportFeature -import SwiftUI - -public struct DirectMessageView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .empty: - CaseLet( - /DirectMessageLogic.Child.State.empty, - action: DirectMessageLogic.Child.Action.empty, - then: DirectMessageEmptyView.init(store:) - ) - - case .loading: - ProgressView() - .tint(Color.white) - .frame(maxHeight: .infinity) - - case .content: - CaseLet( - /DirectMessageLogic.Child.State.content, - action: DirectMessageLogic.Child.Action.content, - then: DirectMessageContentView.init(store:) - ) - } - } - .task { await store.send(.onTask).finish() } - } -} - -#Preview { - NavigationStack { - DirectMessageView( - store: .init( - initialState: DirectMessageLogic.State( - targetUserId: "uuid" - ), - reducer: { DirectMessageLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageContent.swift b/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageContent.swift deleted file mode 100644 index b74302a4..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageContent.swift +++ /dev/null @@ -1,39 +0,0 @@ -import ComposableArchitecture -import DirectMessageLogic -import SwiftUI - -public struct DirectMessageContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ScrollView { - ScrollViewReader { proxy in - LazyVStack(spacing: 8) { - if viewStore.hasNextPage { - ProgressView() - .tint(Color.white) - .frame(height: 44) - .frame(maxWidth: .infinity) - .task { await store.send(.scrollViewBottomReached).finish() } - } - - ForEachStore( - store.scope(state: \.sortedRows, action: \.rows), - content: DirectMessageRowView.init(store:) - ) - } - .padding(.all, 16) - .onAppear { - guard let id = viewStore.lastId else { return } - proxy.scrollTo(id) - } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift b/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift deleted file mode 100644 index 6a9858a8..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageEmpty.swift +++ /dev/null @@ -1,65 +0,0 @@ -import ComposableArchitecture -import DirectMessageLogic -import Styleguide -import SwiftUI - -public struct DirectMessageEmptyView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 0) { - VStack(spacing: 24) { - Image(ImageResource.yes) - - VStack(spacing: 8) { - Text("Matched with \(viewStore.displayName)!", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - Text("Add tenten and send a message!", bundle: .module) - } - .multilineTextAlignment(.center) - - VStack(spacing: 12) { - PrimaryButton( - String(localized: "Copy tenten’s PIN", bundle: .module) - ) { - store.send(.jumpExternalProductButtonTapped) - } - - Text("🧷 \(viewStore.tentenPinCode)", bundle: .module) - .foregroundStyle(Color.white) - .font(.system(.caption, design: .rounded, weight: .semibold)) - } - } - .frame(maxHeight: .infinity) - - Text("The operator may check and delete the contents of messages for the purpose of operating a sound service. In addition, the account may be suspended if inappropriate use is confirmed.", bundle: .module) - .font(.caption) - .foregroundStyle(Color.secondary) - } - .padding(.bottom, 8) - .padding(.horizontal, 16) - } - } -} - -#Preview { - NavigationStack { - DirectMessageEmptyView( - store: .init( - initialState: DirectMessageEmptyLogic.State( - displayName: "tomokisun", - externalProductUrl: "https://bere.al/tomokisun", - tentenPinCode: "du9v5pq" - ), - reducer: { DirectMessageEmptyLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageRow.swift b/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageRow.swift deleted file mode 100644 index 67aa372d..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/DirectMessageRow.swift +++ /dev/null @@ -1,40 +0,0 @@ -import ComposableArchitecture -import DirectMessageLogic -import SwiftUI - -public struct DirectMessageRowView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - let isAuthor = viewStore.message.isAuthor - HStack(spacing: 0) { - Text(viewStore.message.text) - .padding(.vertical, 8) - .padding(.horizontal, 12) - .foregroundStyle(isAuthor ? Color.black : Color.primary) - .background(isAuthor ? Color.white : Color(uiColor: UIColor.secondarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .padding(isAuthor ? Edge.Set.leading : Edge.Set.trailing, 100) - .frame(maxWidth: .infinity, alignment: isAuthor ? Alignment.trailing : Alignment.leading) - } - .id(viewStore.id) - .listRowSeparator(.hidden) - .contextMenu { - Button { - store.send(.reportButtonTapped) - } label: { - Label { - Text("Report", bundle: .module) - } icon: { - Image(systemName: "exclamationmark.triangle") - } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/DirectMessageFeature/Localizable.xcstrings deleted file mode 100644 index 290c9f2b..00000000 --- a/Packages/TenMatch/Sources/DirectMessageFeature/Localizable.xcstrings +++ /dev/null @@ -1,246 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "🧷 %@" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - } - } - }, - "Add tenten and send a message!" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Agrega tenten y envía un mensaje!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajoutez un tenten et envoyez un message !" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenを追加してメッセージを送ってみよう!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로켓을 추가하고 메시지를 보내세요!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dodaj tenten i wyślij wiadomość!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thêm tenten và gửi tin nhắn!" - } - } - } - }, - "Copy tenten’s PIN" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copiar el PIN de tenten" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copier le PIN de tenten" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenのPINをコピー" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "tenten의 PIN 복사" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skopiuj PIN tenten" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sao chép PIN của tenten" - } - } - } - }, - "Matched with %@!" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Emparejado con %@!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correspondance avec %@ !" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@さんとマッチしたよ!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@님과 매치되었습니다!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dopasowany z %@!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kết hợp với %@!" - } - } - } - }, - "Report" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Informar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signaler" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通報" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "신고" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zgłoś" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Báo cáo" - } - } - } - }, - "The operator may check and delete the contents of messages for the purpose of operating a sound service. In addition, the account may be suspended if inappropriate use is confirmed." : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "El operador puede verificar y eliminar el contenido de los mensajes con el propósito de operar un servicio saludable. Además, la cuenta puede ser suspendida si se confirma el uso inapropiado." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'opérateur peut vérifier et supprimer le contenu des messages dans le but de fournir un service sain. De plus, le compte peut être suspendu si une utilisation inappropriée est confirmée." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "健全なサービスを運営する目的で運営者がメッセージの内容を確認・削除する場合があります。また、不適切な利用を確認するとアカウントを停止する場合があります。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "운영자는 건전한 서비스를 운영하기 위해 메시지 내용을 확인하고 삭제할 수 있습니다. 또한 부적절한 사용이 확인되면 계정이 정지될 수 있습니다." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Operator może sprawdzać i usuwać treści wiadomości w celu zapewnienia prawidłowego działania usługi. Ponadto konto może zostać zawieszone w przypadku potwierdzenia nieodpowiedniego użytkowania." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nhà điều hành có thể kiểm tra và xóa nội dung tin nhắn để cung cấp dịch vụ tốt. Ngoài ra, tài khoản có thể bị đình chỉ nếu phát hiện sử dụng không đúng mục đích." - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/Contents.json b/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/Contents.json deleted file mode 100644 index 4353078c..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "received-like.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/received-like.pdf b/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/received-like.pdf deleted file mode 100644 index bf79723a..00000000 Binary files a/Packages/TenMatch/Sources/DirectMessageTabFeature/Assets.xcassets/received-like.imageset/received-like.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift deleted file mode 100644 index 74f651d8..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageList.swift +++ /dev/null @@ -1,37 +0,0 @@ -import ComposableArchitecture -import DirectMessageTabLogic -import SwiftUI - -public struct DirectMessageListView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - LazyVStack(alignment: .leading, spacing: 8) { - Text("Messages", bundle: .module) - .foregroundStyle(Color.secondary) - .font(.system(.callout, design: .rounded, weight: .semibold)) - - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - .frame(height: 300) - .frame(maxWidth: .infinity) - case .content: - CaseLet( - /DirectMessageListLogic.Child.State.content, - action: DirectMessageListLogic.Child.Action.content, - then: DirectMessageListContentView.init(store:) - ) - } - } - } - .padding(.horizontal, 16) - .task { await store.send(.onTask).finish() } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContent.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContent.swift deleted file mode 100644 index 2450cf25..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContent.swift +++ /dev/null @@ -1,30 +0,0 @@ -import ComposableArchitecture -import DirectMessageTabLogic -import SwiftUI - -public struct DirectMessageListContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - LazyVStack(alignment: .leading, spacing: 8) { - ForEachStore( - store.scope(state: \.sortedRows, action: \.rows), - content: DirectMessageListContentRowView.init(store:) - ) - - if viewStore.hasNextPage { - ProgressView() - .tint(Color.white) - .frame(height: 44) - .frame(maxWidth: .infinity) - .task { await store.send(.scrollViewBottomReached).finish() } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift deleted file mode 100644 index 9dc28f2a..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageListContentRow.swift +++ /dev/null @@ -1,77 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import DirectMessageTabLogic -import Styleguide -import SwiftUI - -public struct DirectMessageListContentRowView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped) - } label: { - HStack(spacing: 8) { - Button { - store.send(.iconButtonTapped) - } label: { - CachedAsyncImage( - url: URL(string: viewStore.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: 72, height: 72) - }, - placeholder: { - Color.black - .frame(width: 72, height: 72) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .clipShape(Circle()) - } - - VStack(alignment: .leading, spacing: 6) { - HStack(spacing: 0) { - Text(viewStore.displayName) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, alignment: .leading) - - if !viewStore.isAuthor { - Text("Reply!", bundle: .module) - .font(.system(.caption2, weight: .medium)) - .foregroundStyle(Color.black) - .padding(.vertical, 3) - .padding(.horizontal, 6) - .background(Color.white) - .clipShape(RoundedRectangle(cornerRadius: 4)) - } - } - - Text(viewStore.text) - .lineLimit(1) - .font(.body) - .foregroundStyle(viewStore.textForegroundColor) - } - } - .padding(.vertical, 8) - .background() - .compositingGroup() - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageTab.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageTab.swift deleted file mode 100644 index df7a6385..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/DirectMessageTab.swift +++ /dev/null @@ -1,93 +0,0 @@ -import BannerFeature -import ComposableArchitecture -import DirectMessageFeature -import DirectMessageTabLogic -import NotificationsReEnableFeature -import ProfileExplorerFeature -import ReceivedLikeRouterFeature -import SettingsFeature -import SwiftUI - -public struct DirectMessageTabView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStack { - ScrollView(.vertical) { - LazyVStack(spacing: 16) { - IfLetStore( - store.scope(state: \.notificationsReEnable, action: \.notificationsReEnable), - then: NotificationsReEnableView.init(store:) - ) - - ForEachStore( - store.scope(state: \.banners, action: \.banners), - content: BannerView.init(store:) - ) - } - .padding(.horizontal, 16) - - LazyVStack(alignment: .leading, spacing: 32) { - IfLetStore( - store.scope(state: \.unsent, action: \.unsent), - then: UnsentDirectMessageListView.init(store:) - ) - - IfLetStore( - store.scope(state: \.messages, action: \.messages), - then: DirectMessageListView.init(store:) - ) - } - } - .toolbar(.visible, for: .tabBar) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - ToolbarItem(placement: .topBarTrailing) { - Button { - store.send(.settingsButtonTapped) - } label: { - Image(systemName: "gearshape.fill") - .foregroundStyle(Color.primary) - } - } - } - .sheet( - store: store.scope(state: \.$destination.directMessage, action: \.destination.directMessage), - content: DirectMessageView.init(store:) - ) - .fullScreenCover( - store: store.scope(state: \.$destination.receivedLike, action: \.destination.receivedLike), - content: ReceivedLikeRouterView.init(store:) - ) - .navigationDestination( - store: store.scope(state: \.$destination.explorer, action: \.destination.explorer), - destination: ProfileExplorerView.init(store:) - ) - .navigationDestination( - store: store.scope(state: \.$destination.settings, action: \.destination.settings), - destination: SettingsView.init(store:) - ) - } - .tint(Color.primary) - } -} - -#Preview { - NavigationStack { - DirectMessageTabView( - store: .init( - initialState: DirectMessageTabLogic.State(), - reducer: { DirectMessageTabLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings deleted file mode 100644 index 753d1189..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/Localizable.xcstrings +++ /dev/null @@ -1,206 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Likes" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "Likes" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "좋아요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "J'aime" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polubienia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thích" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Me gusta" - } - } - } - }, - "Messages" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メッセージ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메시지" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Messages" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiadomości" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tin nhắn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensajes" - } - } - } - }, - "Recently Match" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最近のマッチ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최근 매치" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Match récent" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Niedawno dopasowane" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kết hợp gần đây" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Coincidencia reciente" - } - } - } - }, - "Reply!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "返信しよう" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "답장!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Répondre !" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odpowiedz!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trả lời!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Responder!" - } - } - } - }, - "See More" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "すべて見る" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "더 보기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voir plus" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zobacz więcej" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xem thêm" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ver más" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift deleted file mode 100644 index 328a53c2..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageList.swift +++ /dev/null @@ -1,71 +0,0 @@ -import ComposableArchitecture -import DirectMessageTabLogic -import RecentMatchFeature -import SwiftUI - -public struct UnsentDirectMessageListView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - VStack(alignment: .leading, spacing: 8) { - HStack(spacing: 0) { - Text("Recently Match", bundle: .module) - .foregroundStyle(Color.secondary) - .font(.system(.callout, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, alignment: .leading) - - Button { - store.send(.seeAllButtonTapped) - } label: { - HStack(spacing: 4) { - Text("See More", bundle: .module) - .font(.caption) - .foregroundStyle(Color.secondary) - - Image(systemName: "chevron.right") - } - } - } - .padding(.horizontal, 16) - - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - VStack(spacing: 0) { - ProgressView() - .tint(Color.white) - .frame(maxWidth: .infinity, alignment: .center) - } - .frame(height: 150) - case .content: - CaseLet( - /UnsentDirectMessageListLogic.Child.State.content, - action: UnsentDirectMessageListLogic.Child.Action.content, - then: UnsentDirectMessageListContentView.init(store:) - ) - } - } - } - .padding(.top, 16) - .navigationDestination( - store: store.scope(state: \.$destination.recentMatch, action: \.destination.recentMatch), - destination: RecentMatchView.init(store:) - ) - } -} - -#Preview { - NavigationStack { - UnsentDirectMessageListView( - store: .init( - initialState: UnsentDirectMessageListLogic.State(), - reducer: { UnsentDirectMessageListLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift deleted file mode 100644 index e35cc1a3..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContent.swift +++ /dev/null @@ -1,38 +0,0 @@ -import ComposableArchitecture -import DirectMessageTabLogic -import SwiftUI - -public struct UnsentDirectMessageListContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ScrollView(.horizontal) { - LazyHStack(spacing: 12) { - IfLetStore( - store.scope(state: \.receivedLike, action: \.receivedLike), - then: UnsentDirectMessageListContentReceivedLikeRowView.init(store:) - ) - - ForEachStore( - store.scope(state: \.sortedRows, action: \.rows), - content: UnsentDirectMessageListContentRowView.init(store:) - ) - - if viewStore.hasNextPage { - ProgressView() - .tint(Color.white) - .frame(width: 96, height: 96) - .task { await store.send(.scrollViewBottomReached).finish() } - } - } - .padding(.horizontal, 16) - } - .scrollIndicators(.hidden) - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift deleted file mode 100644 index b325caf8..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentReceivedLikeRow.swift +++ /dev/null @@ -1,79 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import DirectMessageTabLogic -import Styleguide -import SwiftUI - -public struct UnsentDirectMessageListContentReceivedLikeRowView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - var goldGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFF9F0A), - Color(0xFFD60A), - ], - startPoint: .top, - endPoint: .bottom - ) - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped) - } label: { - VStack(spacing: 12) { - CachedAsyncImage( - url: URL(string: viewStore.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { image in - image - .resizable() - .frame(width: 96, height: 96) - .blur(radius: 18) - }, - placeholder: { - Color.black - .frame(width: 96, height: 96) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .overlay { - RoundedRectangle(cornerRadius: 6) - .stroke(goldGradient, lineWidth: 4) - } - .clipShape(RoundedRectangle(cornerRadius: 6)) - .overlay { - HStack(alignment: .center, spacing: 0) { - Text(Image(systemName: "heart.fill")) - .font(.system(size: 14)) - - Text(viewStore.displayCount) - .font(.system(.body, design: .rounded, weight: .semibold)) - } - .foregroundStyle(Color.black) - .padding(.vertical, 4) - .padding(.horizontal, 6) - .background(goldGradient) - .clipShape(RoundedRectangle(cornerRadius: .infinity)) - } - - Text("Likes", bundle: .module) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.primary) - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift b/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift deleted file mode 100644 index e676c782..00000000 --- a/Packages/TenMatch/Sources/DirectMessageTabFeature/UnsentDirectMessageListContentRow.swift +++ /dev/null @@ -1,59 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import DirectMessageTabLogic -import Styleguide -import SwiftUI - -public struct UnsentDirectMessageListContentRowView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped) - } label: { - VStack(spacing: 12) { - CachedAsyncImage( - url: URL(string: viewStore.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: 96, height: 120) - }, - placeholder: { - Color.black - .frame(width: 96, height: 120) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .clipShape(RoundedRectangle(cornerRadius: 8)) - .overlay(alignment: .bottom) { - if !viewStore.isRead { - Color.red - .frame(width: 16, height: 16) - .clipShape(Circle()) - .offset(y: 8) - } - } - - Text(viewStore.displayName) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.primary) - } - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift b/Packages/TenMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift deleted file mode 100644 index ef34b66b..00000000 --- a/Packages/TenMatch/Sources/DisplayNameSettingFeature/DisplayNameSetting.swift +++ /dev/null @@ -1,64 +0,0 @@ -import ComposableArchitecture -import DisplayNameSettingLogic -import Styleguide -import SwiftUI - -public struct DisplayNameSettingView: View { - @FocusState var isFocused: Bool - - private var store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 8) { - Text("Set your nick name", bundle: .module) - .font(.system(.title2, weight: .bold)) - - VStack(spacing: 32) { - Text("ex. tomokisun", bundle: .module) - .font(.caption) - .tint(Color.gray) - .foregroundStyle(Color.gray) - - TextField("", text: viewStore.$displayName) - .foregroundStyle(Color.white) - .textInputAutocapitalization(.never) - .autocorrectionDisabled() - .frame(height: 56) - .focused($isFocused) - .background(Color(uiColor: UIColor.systemFill)) - .font(.system(.title3, design: .rounded, weight: .semibold)) - .clipShape(RoundedRectangle(cornerRadius: 12)) - } - - Spacer() - - PrimaryButton( - String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible - ) { - store.send(.nextButtonTapped) - } - } - .padding(.top, 32) - .padding(.bottom, 16) - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .onAppear { - isFocused = true - } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - .alert(store: store.scope(state: \.$alert, action: \.alert)) - } - } -} diff --git a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings deleted file mode 100644 index c9fdfe50..00000000 --- a/Packages/TenMatch/Sources/DisplayNameSettingFeature/Localizable.xcstrings +++ /dev/null @@ -1,129 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - "Continue" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - } - } - }, - "ex. tomokisun" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "ej. tomokisun" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ex. tomokisun" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "例: ともき" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "예: tomokisun" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "np. tomokisun" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "ví dụ: tomokisun" - } - } - } - }, - "Set your nick name" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Establece tu apodo" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Définissez votre pseudo" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ニックネームを設定してください" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "별명을 설정하세요" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ustaw swój pseudonim" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đặt biệt danh của bạn" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ForceUpdateFeature/ForceUpdate.swift b/Packages/TenMatch/Sources/ForceUpdateFeature/ForceUpdate.swift deleted file mode 100644 index 52460a92..00000000 --- a/Packages/TenMatch/Sources/ForceUpdateFeature/ForceUpdate.swift +++ /dev/null @@ -1,45 +0,0 @@ -import ComposableArchitecture -import ForceUpdateLogic -import Styleguide -import SwiftUI - -public struct ForceUpdateView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { _ in - VStack(spacing: 24) { - Text("Notice", bundle: .module) - .font(.system(.title, design: .rounded, weight: .semibold)) - - Text("... Oh? ! ! Looks like TenMatch...! \nPlease update to the latest version.", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - - PrimaryButton( - String(localized: "Update", bundle: .module) - ) { - store.send(.updateButtonTapped) - } - } - .padding(.horizontal, 24) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(Color.black) - .foregroundStyle(Color.white) - .multilineTextAlignment(.center) - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - ForceUpdateView( - store: .init( - initialState: ForceUpdateLogic.State(), - reducer: { ForceUpdateLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/ForceUpdateFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ForceUpdateFeature/Localizable.xcstrings deleted file mode 100644 index 56ddd35f..00000000 --- a/Packages/TenMatch/Sources/ForceUpdateFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "... Oh? ! ! Looks like TenMatch...! \nPlease update to the latest version." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "...おや?!TenMatchのようすが...!\n最新バージョンへのアップデートをお願いします。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "...오? ! ! TenMatch처럼 보이네요...! \n최신 버전으로 업데이트해 주세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "... Oh ? ! ! On dirait TenMatch...! \nVeuillez mettre à jour vers la dernière version." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "... Och? ! ! Wygląda na TenMatch...! \nProszę zaktualizować do najnowszej wersji." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "... Ồ? ! ! Trông giống như TenMatch...! \nVui lòng cập nhật lên phiên bản mới nhất." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "... ¡Oh? ! ! Parece TenMatch...! \nPor favor, actualiza a la última versión." - } - } - } - }, - "Notice" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お知らせ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "공지" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Avis" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Powiadomienie" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thông báo" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aviso" - } - } - } - }, - "Update" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アップデート" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업데이트" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mettre à jour" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktualizować" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cập nhật" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualizar" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/Contents.json b/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/Contents.json deleted file mode 100644 index 7fa0a306..00000000 --- a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "no.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/no.pdf b/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/no.pdf deleted file mode 100644 index b24c0f7a..00000000 Binary files a/Packages/TenMatch/Sources/FreezedFeature/Assets.xcassets/no.imageset/no.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/FreezedFeature/Freezed.swift b/Packages/TenMatch/Sources/FreezedFeature/Freezed.swift deleted file mode 100644 index 76408def..00000000 --- a/Packages/TenMatch/Sources/FreezedFeature/Freezed.swift +++ /dev/null @@ -1,50 +0,0 @@ -import ComposableArchitecture -import FreezedLogic -import Styleguide -import SwiftUI - -public struct FreezedView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - VStack(spacing: 24) { - Image(ImageResource.no) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 120) - - Text("Currently unable to re-register", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - Text("Once you have deleted your TenMatch account, you will not be able to register again for a certain period of time after the deletion.", bundle: .module) - - Text("Please answer our simple questionnaire to help us improve our service.", bundle: .module) - - PrimaryButton( - String(localized: "Answer", bundle: .module) - ) { - print(#function) - } - } - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .task { await store.send(.onTask).finish() } - } -} - -#Preview { - NavigationStack { - FreezedView( - store: .init( - initialState: FreezedLogic.State(), - reducer: { FreezedLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/FreezedFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/FreezedFeature/Localizable.xcstrings deleted file mode 100644 index f1ab9973..00000000 --- a/Packages/TenMatch/Sources/FreezedFeature/Localizable.xcstrings +++ /dev/null @@ -1,166 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Answer" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "回答する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "답변" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Répondre" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odpowiedz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trả lời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Responder" - } - } - } - }, - "Currently unable to re-register" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "現在再登録することができません" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "현재 재등록할 수 없습니다" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Impossible de se réinscrire actuellement" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obecnie brak możliwości ponownej rejestracji" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hiện không thể đăng ký lại" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualmente no es posible volver a registrarse" - } - } - } - }, - "Once you have deleted your TenMatch account, you will not be able to register again for a certain period of time after the deletion." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "一度TenMatchのアカウント削除をされた方は、削除してから一定期間は再登録していただくことができません。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch 계정을 삭제하면 삭제 후 일정 기간 동안 다시 등록할 수 없습니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Une fois que vous avez supprimé votre compte TenMatch, vous ne pourrez pas vous réinscrire pendant une certaine période après la suppression." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Po usunięciu konta TenMatch, nie będzie można ponownie zarejestrować się przez pewien czas po usunięciu." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sau khi xóa tài khoản TenMatch của bạn, bạn sẽ không thể đăng ký lại trong một khoảng thời gian nhất định sau khi xóa." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Una vez que hayas eliminado tu cuenta de TenMatch, no podrás registrarte nuevamente por un cierto período de tiempo después de la eliminación." - } - } - } - }, - "Please answer our simple questionnaire to help us improve our service." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サービス改善のためにかんたんなアンケートへのご回答お願いします。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "서비스 개선을 위해 간단한 설문지에 답변해 주세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Veuillez répondre à notre simple questionnaire pour nous aider à améliorer notre service." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Prosimy o odpowiedź na naszą prostą ankietę, aby pomóc nam poprawić nasze usługi." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vui lòng trả lời bảng câu hỏi đơn giản của chúng tôi để giúp chúng tôi cải thiện dịch vụ của mình." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor, responda a nuestro sencillo cuestionario para ayudarnos a mejorar nuestro servicio." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/GenderSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/GenderSettingFeature/GenderSetting.swift b/Packages/TenMatch/Sources/GenderSettingFeature/GenderSetting.swift deleted file mode 100644 index 842005b8..00000000 --- a/Packages/TenMatch/Sources/GenderSettingFeature/GenderSetting.swift +++ /dev/null @@ -1,104 +0,0 @@ -import API -import ComposableArchitecture -import GenderSettingLogic -import Styleguide -import SwiftUI - -public struct GenderSettingView: View { - public enum NextButtonStyle: Equatable { - case next - case save - } - - let store: StoreOf - private let nextButtonStyle: NextButtonStyle - private let canSkip: Bool - - public init( - store: StoreOf, - nextButtonStyle: NextButtonStyle, - canSkip: Bool - ) { - self.store = store - self.nextButtonStyle = nextButtonStyle - self.canSkip = canSkip - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 0) { - Text("Please tell us your gender.", bundle: .module) - .font(.system(.title2, weight: .bold)) - - List(viewStore.genders, id: \.self) { gender in - Button { - store.send(.genderButtonTapped(gender)) - } label: { - LabeledContent { - if viewStore.selection == gender { - Image(systemName: "checkmark.circle") - } - } label: { - Text(gender.displayValue) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(height: 44) - } - } - .scrollDisabled(true) - .foregroundStyle(Color.white) - - Spacer() - - VStack(spacing: 0) { - PrimaryButton( - nextButtonStyle == .save - ? String(localized: "Save", bundle: .module) - : String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.selection == nil - ) { - store.send(.nextButtonTapped) - } - - if canSkip { - Button { - store.send(.skipButtonTapped) - } label: { - Text("Skip", bundle: .module) - .frame(height: 50) - .foregroundStyle(Color.white) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - } - } - } - .padding(.horizontal, 16) - } - .padding(.top, 32) - .padding(.bottom, 16) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} - -#Preview { - NavigationStack { - GenderSettingView( - store: .init( - initialState: GenderSettingLogic.State(gender: nil), - reducer: { GenderSettingLogic() } - ), - nextButtonStyle: .next, - canSkip: true - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/GenderSettingFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/GenderSettingFeature/Localizable.xcstrings deleted file mode 100644 index 0438b509..00000000 --- a/Packages/TenMatch/Sources/GenderSettingFeature/Localizable.xcstrings +++ /dev/null @@ -1,167 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - } - } - }, - "Please tell us your gender." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "性別を設定してください" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "성별을 알려주세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Veuillez nous indiquer votre sexe." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proszę podać swoją płeć." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vui lòng cho chúng tôi biết giới tính của bạn." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor, dinos tu género." - } - } - } - }, - "Save" : { - "extractionState" : "manual", - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "저장" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enregistrer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zapisz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lưu" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guardar" - } - } - } - }, - "Skip" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スキップ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "건너뛰기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pomiń" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bỏ qua" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Omitir" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/HowToMovieFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/HowToMovieFeature/HowToMovie.swift b/Packages/TenMatch/Sources/HowToMovieFeature/HowToMovie.swift deleted file mode 100644 index ab0d0b80..00000000 --- a/Packages/TenMatch/Sources/HowToMovieFeature/HowToMovie.swift +++ /dev/null @@ -1,56 +0,0 @@ -import AVKit -import ComposableArchitecture -import HowToMovieLogic -import Styleguide -import SwiftUI - -public struct HowToMovieView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 36) { - Text("In the tenten, select your favorites and tap 'Save' 📸.", bundle: .module) - .font(.system(.title2, weight: .bold)) - - VideoPlayer(player: viewStore.player) - - Spacer() - - PrimaryButton( - String(localized: "Continue", bundle: .module) - ) { - store.send(.nextButtonTapped) - } - } - .padding(.top, 32) - .padding(.bottom, 16) - .padding(.horizontal, 16) - .background(Color.black) - .foregroundStyle(Color.white) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} - -#Preview { - NavigationStack { - HowToMovieView( - store: .init( - initialState: HowToMovieLogic.State(), - reducer: { HowToMovieLogic() } - ) - ) - } -} diff --git a/Packages/TenMatch/Sources/HowToMovieFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/HowToMovieFeature/Localizable.xcstrings deleted file mode 100644 index 7f80221a..00000000 --- a/Packages/TenMatch/Sources/HowToMovieFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - } - } - }, - "In the tenten, select your favorites and tap 'Save' 📸." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenでお気に入りを選択し、「保存」📸をタップします。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "tenten에서 즐겨찾기를 선택하고 '저장' 📸을(를) 탭하세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dans le tenten, sélectionnez vos favoris et appuyez sur 'Enregistrer' 📸." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W tenten wybierz swoje ulubione i dotknij 'Zapisz' 📸." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trong tenten, chọn những mục yêu thích của bạn và nhấn 'Lưu' 📸." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "En el tenten, selecciona tus favoritos y toca 'Guardar' 📸." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/Contents.json b/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/Contents.json deleted file mode 100644 index cc7dedfb..00000000 --- a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "invite-ticket.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/invite-ticket.pdf b/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/invite-ticket.pdf deleted file mode 100644 index c8ae6045..00000000 Binary files a/Packages/TenMatch/Sources/InvitationCodeFeature/Assets.xcassets/invite-ticket.imageset/invite-ticket.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/InvitationCodeFeature/InvitationCode.swift b/Packages/TenMatch/Sources/InvitationCodeFeature/InvitationCode.swift deleted file mode 100644 index 6f47efd0..00000000 --- a/Packages/TenMatch/Sources/InvitationCodeFeature/InvitationCode.swift +++ /dev/null @@ -1,51 +0,0 @@ -import ComposableArchitecture -import InvitationCodeLogic -import Styleguide -import SwiftUI - -public struct InvitationCodeView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 16) { - VStack(spacing: 16) { - Image(ImageResource.inviteTicket) - .resizable() - .aspectRatio(contentMode: .fit) - .overlay(alignment: .center) { - Text(viewStore.code) - .foregroundStyle(Color(0xFFFF_CC00)) - .font(.system(.largeTitle, design: .rounded, weight: .bold)) - .offset(x: -35, y: 8) - } - } - .padding(.all, 16) - .background(Color(uiColor: UIColor.secondarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .padding(.horizontal, 16) - } - .padding(.vertical, 24) - .background() - .navigationTitle(String(localized: "Invitation Code", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - NavigationStack { - InvitationCodeView( - store: .init( - initialState: InvitationCodeLogic.State(), - reducer: { InvitationCodeLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/InvitationCodeFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/InvitationCodeFeature/Localizable.xcstrings deleted file mode 100644 index 2b9f4aa3..00000000 --- a/Packages/TenMatch/Sources/InvitationCodeFeature/Localizable.xcstrings +++ /dev/null @@ -1,46 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Invitation Code" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待コード" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "초대 코드" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code d'invitation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kod zaproszenia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mã mời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de invitación" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/InvitationFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/InvitationFeature/Invitation.swift b/Packages/TenMatch/Sources/InvitationFeature/Invitation.swift deleted file mode 100644 index 51ef859f..00000000 --- a/Packages/TenMatch/Sources/InvitationFeature/Invitation.swift +++ /dev/null @@ -1,81 +0,0 @@ -import ComposableArchitecture -import InvitationLogic -import Styleguide -import SwiftUI - -public struct InvitationView: View { - @FocusState var isFocused: Bool - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 32) { - Text("If you have an invitation code.\nPlease let us know.", bundle: .module) - .frame(height: 50) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - TextField(text: viewStore.$code) { - Text("Invitation Code", bundle: .module) - } - .foregroundStyle(Color.white) - .keyboardType(.alphabet) - .textInputAutocapitalization(.never) - .autocorrectionDisabled() - .focused($isFocused) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - Spacer() - - VStack(spacing: 0) { - PrimaryButton( - String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.isDisabled - ) { - store.send(.nextButtonTapped) - } - - Button { - store.send(.skipButtonTapped) - } label: { - Text("Skip", bundle: .module) - .frame(height: 50) - .foregroundStyle(Color.white) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - } - } - } - .padding(.top, 24) - .padding(.bottom, 16) - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .onAppear { - isFocused = true - } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} - -#Preview { - NavigationStack { - InvitationView( - store: .init( - initialState: InvitationLogic.State(), - reducer: { InvitationLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/InvitationFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/InvitationFeature/Localizable.xcstrings deleted file mode 100644 index a2166e22..00000000 --- a/Packages/TenMatch/Sources/InvitationFeature/Localizable.xcstrings +++ /dev/null @@ -1,166 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - } - } - }, - "If you have an invitation code.\nPlease let us know." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待コードがあれば\n教えてください" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "초대 코드가 있으면 알려주세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous avez un code d'invitation, \nveuillez nous en informer." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jeśli masz kod zaproszenia.\nProszę, daj nam znać." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nếu bạn có mã mời.\nVui lòng cho chúng tôi biết." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si tienes un código de invitación.\nPor favor, háznoslo saber." - } - } - } - }, - "Invitation Code" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待コード" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "초대 코드" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Code d'invitation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kod zaproszenia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mã mời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Código de invitación" - } - } - } - }, - "Skip" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スキップ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "건너뛰기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pomiń" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bỏ qua" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Omitir" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/LaunchFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/LaunchFeature/Launch.swift b/Packages/TenMatch/Sources/LaunchFeature/Launch.swift deleted file mode 100644 index d2eccee0..00000000 --- a/Packages/TenMatch/Sources/LaunchFeature/Launch.swift +++ /dev/null @@ -1,39 +0,0 @@ -import ComposableArchitecture -import LaunchLogic -import Styleguide -import SwiftUI - -public struct LaunchView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Image(ImageResource.logo) - .aspectRatio(contentMode: .fit) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .ignoresSafeArea() - .background(Color(0xFFFF_0000)) - .task { await store.send(.onTask).finish() } - .overlay { - if viewStore.isActivityIndicatorVisible { - ProgressView() - .tint(Color.white) - .offset(y: 114) - } - } - } - } -} - -#Preview { - LaunchView( - store: .init( - initialState: LaunchLogic.State(), - reducer: { LaunchLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/MaintenanceFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/MaintenanceFeature/Localizable.xcstrings deleted file mode 100644 index b510784e..00000000 --- a/Packages/TenMatch/Sources/MaintenanceFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Contact us" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お問い合わせ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문의하기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactez-nous" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skontaktuj się z nami" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liên hệ với chúng tôi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contáctanos" - } - } - } - }, - "Please wait for a while until service resumes." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サービス再開までしばらくお待ち下さい。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "서비스가 재개될 때까지 잠시 기다려주십시오." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Veuillez patienter un moment jusqu'à la reprise du service." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proszę czekać na wznowienie usługi." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vui lòng đợi một lát cho đến khi dịch vụ được tiếp tục." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor, espere un momento hasta que se reanude el servicio." - } - } - } - }, - "Under Maintenance" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メンテナンス中" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "점검 중" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En maintenance" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W trakcie konserwacji" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đang bảo trì" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "En mantenimiento" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/MaintenanceFeature/Maintenance.swift b/Packages/TenMatch/Sources/MaintenanceFeature/Maintenance.swift deleted file mode 100644 index 5f6c49aa..00000000 --- a/Packages/TenMatch/Sources/MaintenanceFeature/Maintenance.swift +++ /dev/null @@ -1,50 +0,0 @@ -import ComposableArchitecture -import MaintenanceLogic -import Styleguide -import SwiftUI - -public struct MaintenanceView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 80) { - VStack(spacing: 24) { - Text("Under Maintenance", bundle: .module) - .font(.system(.title, design: .rounded, weight: .semibold)) - - Text("Please wait for a while until service resumes.", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - } - - Link(destination: viewStore.contactUsURL) { - Text("Contact us", bundle: .module) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(height: 50) - .frame(maxWidth: .infinity) - .foregroundStyle(Color.black) - .background(Color.white) - .clipShape(RoundedRectangle(cornerRadius: 16)) - } - } - .padding(.horizontal, 24) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(Color.black) - .foregroundStyle(Color.white) - .multilineTextAlignment(.center) - } - } -} - -#Preview { - MaintenanceView( - store: .init( - initialState: MaintenanceLogic.State(), - reducer: { MaintenanceLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/Contents.json b/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/Contents.json deleted file mode 100644 index c9d0d1e6..00000000 --- a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "match-empty.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/match-empty.pdf b/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/match-empty.pdf deleted file mode 100644 index 3e6c0b26..00000000 Binary files a/Packages/TenMatch/Sources/MatchEmptyFeature/Assets.xcassets/match-empty.imageset/match-empty.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MatchEmptyFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/MatchEmptyFeature/Localizable.xcstrings deleted file mode 100644 index 5b07cde6..00000000 --- a/Packages/TenMatch/Sources/MatchEmptyFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Let's swipe." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スワイプしよう" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "스와이프 하자." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Swipez." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przesuń." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desliza." - } - } - } - }, - "Swipe" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スワイプする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "스와이프" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Swipe" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przesuń" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desliza" - } - } - } - }, - "When you match with someone, their profile will appear here" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "誰かとマッチするとここに相手のプロフィールが表示されます" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누군가와 매치되면 프로필이 여기에 표시됩니다" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lorsque vous faites une correspondance avec quelqu'un, son profil apparaîtra ici" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gdy dopasujesz się z kimś, jego profil pojawi się tutaj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khi bạn phù hợp với ai đó, hồ sơ của họ sẽ xuất hiện ở đây" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cuando coincidas con alguien, su perfil aparecerá aquí" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/MatchEmptyFeature/MatchEmpty.swift b/Packages/TenMatch/Sources/MatchEmptyFeature/MatchEmpty.swift deleted file mode 100644 index 94a4cfcc..00000000 --- a/Packages/TenMatch/Sources/MatchEmptyFeature/MatchEmpty.swift +++ /dev/null @@ -1,48 +0,0 @@ -import ComposableArchitecture -import MatchEmptyLogic -import Styleguide -import SwiftUI - -public struct MatchEmptyView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - VStack(spacing: 24) { - Image(ImageResource.matchEmpty) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(height: 240) - .clipped() - - VStack(spacing: 16) { - Text("Let's swipe.", bundle: .module) - .font(.system(.largeTitle, weight: .bold)) - - Text("When you match with someone, their profile will appear here", bundle: .module) - .font(.system(.callout, design: .rounded, weight: .semibold)) - - PrimaryButton( - String(localized: "Swipe", bundle: .module) - ) { - store.send(.swipeButtonTapped) - } - } - } - .padding(.top, 20) - .multilineTextAlignment(.center) - .foregroundStyle(Color.white) - } -} - -#Preview { - MatchEmptyView( - store: .init( - initialState: MatchEmptyLogic.State(), - reducer: { MatchEmptyLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/MatchedFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MatchedFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/MatchedFeature/Localizable.xcstrings deleted file mode 100644 index d744dc8e..00000000 --- a/Packages/TenMatch/Sources/MatchedFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "🧷 %@" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "🧷 %@" - } - } - } - }, - "Copy tenten’s PIN" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copiar el PIN de tenten" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Copier le PIN de tenten" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenのPINをコピー" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "tenten의 PIN 복사" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Skopiuj PIN tenten" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Sao chép PIN của tenten" - } - } - } - }, - "You matched with %@" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Has hecho coincidir con %@!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous avez été jumelé avec %@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@さんとマッチしました" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@님과 매칭되었습니다" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dopasowano z %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạn đã kết hợp với %@" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/MatchedFeature/Matched.swift b/Packages/TenMatch/Sources/MatchedFeature/Matched.swift deleted file mode 100644 index 7b22e7e7..00000000 --- a/Packages/TenMatch/Sources/MatchedFeature/Matched.swift +++ /dev/null @@ -1,138 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import MatchedLogic -import Styleguide -import SwiftUI - -public struct MatchedView: View { - @Environment(\.displayScale) var displayScale - @Environment(\.requestReview) var requestReview - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 0) { - VStack(spacing: 16) { - Image(ImageResource.matched) - .resizable() - .aspectRatio(contentMode: .fit) - - HStack(spacing: -12) { - ForEach( - [viewStore.currentUserImageUrl, viewStore.targetUserImageUrl], - id: \.self - ) { imageUrl in - CachedAsyncImage( - url: imageUrl, - urlCache: URLCache.shared, - scale: displayScale, - content: { image in - image - .resizable() - }, - placeholder: { - Color.clear - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .aspectRatio(1, contentMode: .fill) - .clipShape(Circle()) - .frame(width: 128, height: 128) - .overlay( - RoundedRectangle(cornerRadius: 128 / 2) - .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 2.0) - ) - } - } - - Text("You matched with \(viewStore.targetUserDisplayName)", bundle: .module) - .foregroundStyle(Color.white) - .font(.system(.headline, design: .rounded, weight: .semibold)) - } - .frame(maxHeight: .infinity) - .padding(.horizontal, 37) - - VStack(spacing: 12) { - PrimaryButton( - String(localized: "Copy tenten’s PIN", bundle: .module) - ) { - store.send(.addExternalProductButtonTapped) - } - - Text("🧷 \(viewStore.displayTargetUserInfo)", bundle: .module) - .foregroundStyle(Color.white) - .font(.system(.caption, design: .rounded, weight: .semibold)) - } - } - .padding(.horizontal, 16) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .task { - requestReview() - await store.send(.onTask).finish() - } - .overlay(alignment: .topLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .font(.system(size: 12, weight: .regular)) - .frame(width: 36, height: 36) - .foregroundStyle(Color.white) - .background(Color(uiColor: UIColor.quaternarySystemFill)) - .clipShape(Circle()) - } - .padding(.horizontal, 12) - } - .background( - LinearGradient( - colors: [ - Color(0xFF30_D158), - Color(0xFFFF_D60A), - Color(0xFFFF_2E00), - Color(0xFF00_0000), - ], - startPoint: .top, - endPoint: .bottom - ) - ) - .alert( - store: store.scope(state: \.$destination.alert, action: \.destination.alert) - ) - } - } -} - -#Preview { - NavigationStack { - MatchedView( - store: .init( - initialState: MatchedLogic.State( - targetUserId: "", - displayName: "tomokisun", - tentenPinCode: "du9v5pq", - externalProductURL: URL(string: "https://bere.al/tomokisun")! - ), - reducer: MatchedLogic.init, - withDependencies: { - $0.environment = .live( - brand: .tenmatch, - instagramUsername: "", - appId: "", - appStoreForEmptyURL: .applicationDirectory, - docsURL: .applicationDirectory, - howToMovieURL: .applicationDirectory - ) - } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/Contents.json deleted file mode 100644 index 97c4b195..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "bematch-campaign.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/bematch-campaign.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/bematch-campaign.pdf deleted file mode 100644 index 090200f0..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-campaign.imageset/bematch-campaign.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/Contents.json deleted file mode 100644 index 02ab2014..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "bematch-pro.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/bematch-pro.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/bematch-pro.pdf deleted file mode 100644 index 726e29f5..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/bematch-pro.imageset/bematch-pro.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/Contents.json deleted file mode 100644 index 774b7105..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "get-benefit.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/get-benefit.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/get-benefit.pdf deleted file mode 100644 index 8a7cc7cb..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/how-to-receive-benefit.imageset/get-benefit.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/Contents.json deleted file mode 100644 index 8df5d773..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "invitation-code-sample.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/invitation-code-sample.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/invitation-code-sample.pdf deleted file mode 100644 index 4102eb88..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invitation-code-sample.imageset/invitation-code-sample.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/Contents.json deleted file mode 100644 index cc7dedfb..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "invite-ticket.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/invite-ticket.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/invite-ticket.pdf deleted file mode 100644 index c8ae6045..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket-ja.imageset/invite-ticket.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/Contents.json deleted file mode 100644 index faa4b593..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "InviteCard.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/InviteCard.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/InviteCard.pdf deleted file mode 100644 index c9481644..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/invite-ticket.imageset/InviteCard.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/Contents.json deleted file mode 100644 index 56b69823..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/Contents.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "images" : [ - { - "filename" : "line.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - }, - "properties" : { - "preserves-vector-representation" : true - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/line.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/line.pdf deleted file mode 100644 index e8e3e10e..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/line.imageset/line.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf deleted file mode 100644 index 9fa265c5..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Center Content.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index befab51d..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Center Content.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/Contents.json deleted file mode 100644 index fff58218..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "membership-benefit.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/membership-benefit.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/membership-benefit.pdf deleted file mode 100644 index 5309b8e7..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/membership-benefit.imageset/membership-benefit.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/Contents.json deleted file mode 100644 index 1b5280a1..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "purchase-header.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/purchase-header.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/purchase-header.pdf deleted file mode 100644 index 46c5ce34..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/purchase-header.imageset/purchase-header.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/Contents.json deleted file mode 100644 index acc3414f..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "see-who-sent-it.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/see-who-sent-it.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/see-who-sent-it.pdf deleted file mode 100644 index c1a07203..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it-ja.imageset/see-who-sent-it.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/Contents.json b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/Contents.json deleted file mode 100644 index acc3414f..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "see-who-sent-it.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/see-who-sent-it.pdf b/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/see-who-sent-it.pdf deleted file mode 100644 index 9ce551c4..00000000 Binary files a/Packages/TenMatch/Sources/MembershipFeature/Assets.xcassets/see-who-sent-it.imageset/see-who-sent-it.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift b/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift deleted file mode 100644 index fa8ccf06..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionPrimaryButtonStyle.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Styleguide -import SwiftUI - -struct ConversionPrimaryButtonStyle: ButtonStyle { - func makeBody(configuration: Configuration) -> some View { - configuration.label - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(height: 48) - .frame(maxWidth: .infinity) - .foregroundStyle(Color.black) - .background(Color.yellow) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .scaleEffect(configuration.isPressed ? 0.9 : 1.0) - .animation(.default, value: configuration.isPressed) - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift b/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift deleted file mode 100644 index d28e6a9d..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/ButtonStyle/ConversionSecondaryButtonStyle.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Styleguide -import SwiftUI - -struct ConversionSecondaryButtonStyle: ButtonStyle { - func makeBody(configuration: Configuration) -> some View { - configuration.label - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(height: 50) - .frame(maxWidth: .infinity) - .foregroundStyle(Color.black) - .background(Color.white) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .scaleEffect(configuration.isPressed ? 0.9 : 1.0) - .animation(.default, value: configuration.isPressed) - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift b/Packages/TenMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift deleted file mode 100644 index c985789a..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/HowToReceiveBenefitView.swift +++ /dev/null @@ -1,65 +0,0 @@ -import Styleguide -import SwiftUI - -struct HowToReceiveBenefitView: View { - let displayDuration: String - - var body: some View { - VStack(spacing: 24) { - VStack(spacing: 8) { - Text("1. Send invitation code", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - Text("Send an invitation code to a friend who hasn't used TenMatch", bundle: .module) - } - - Image(ImageResource.line) - .resizable() - .aspectRatio(contentMode: .fit) - - VStack(spacing: 8) { - Text("2. \(displayDuration) free for both parties!", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - Text("When they enter the Invitation Code and register, you will both receive TenMatch PRO for sure!", bundle: .module) - } - - Image(ImageResource.invitationCodeSample) - .resizable() - .aspectRatio(contentMode: .fit) - } - .padding(.all, 16) - .padding(.top, 44) - .padding(.bottom, 20) - .multilineTextAlignment(.center) - .background(Color(uiColor: UIColor.secondarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .overlay(alignment: .top) { - Text("How to Receive Benefits", bundle: .module) - .font(.system(.title2, design: .rounded, weight: .semibold)) - .frame(height: 40) - .padding(.horizontal, 8) - .background( - LinearGradient( - colors: [ - Color(0xFFFD_2D76), - Color(0xFFFE_7056), - ], - startPoint: .bottomLeading, - endPoint: .topTrailing - ) - ) - .clipShape(RoundedRectangle(cornerRadius: 4)) - .offset(y: -20) - } - } -} - -#Preview { - NavigationStack { - HowToReceiveBenefitView( - displayDuration: "1 week" - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaign.swift b/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaign.swift deleted file mode 100644 index 2e88aae1..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaign.swift +++ /dev/null @@ -1,82 +0,0 @@ -import ColorHex -import ComposableArchitecture -import MembershipLogic -import SwiftUI - -public struct InvitationCampaignView: View { - let store: StoreOf - - var backgroundGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFFFD_2D76), - Color(0xFFFE_7056), - ], - startPoint: .bottomLeading, - endPoint: .topTrailing - ) - } - - var textGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - } - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 12) { - Text("Limited to first \(viewStore.quantity) Users", bundle: .module) - .font(.system(.headline, design: .rounded, weight: .semibold)) - .padding(.vertical, 6) - .padding(.horizontal, 8) - .overlay( - RoundedRectangle(cornerRadius: 4) - .stroke(Color.primary, lineWidth: 1) - ) - - VStack(spacing: 0) { - Text("Invite a friend and both receive", bundle: .module) - - VStack(spacing: 8) { - Text(viewStore.specialOfferDisplayPrice) - .font(.system(size: 72, weight: .heavy)) - .foregroundStyle(textGradient) - - Text("worth benefits", bundle: .module) - } - } - .font(.system(.title2, weight: .bold)) - } - .padding(.top, 80) - .padding(.bottom, 28) - .frame(maxWidth: .infinity) - .background(backgroundGradient) - .multilineTextAlignment(.center) - } - } -} - -#Preview { - InvitationCampaignView( - store: .init( - initialState: InvitationCampaignLogic.State( - quantity: 2000, - durationWeeks: 48, - specialOfferDisplayPrice: "$100" - ), - reducer: { InvitationCampaignLogic() } - ) - ) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaignPrice.swift b/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaignPrice.swift deleted file mode 100644 index 7ba948e4..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/InvitationCampaignPrice.swift +++ /dev/null @@ -1,43 +0,0 @@ -import ComposableArchitecture -import MembershipLogic -import SwiftUI - -public struct InvitationCampaignPriceView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - let freePrice = Decimal.FormatStyle.Currency(code: viewStore.currencyCode).attributed.format(0) - - VStack(spacing: 20) { - Text("when they use your invitation code you get", bundle: .module) - - Image(ImageResource.bematchPro) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(height: 32) - - Text("\(freePrice) for \(viewStore.displayDuration)", bundle: .module) - .font(.largeTitle) - .fontWeight(.heavy) - .foregroundStyle( - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - ) - } - .padding(.top, 24) - .background() - .multilineTextAlignment(.center) - } - } -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/InvitationCodeCampaign.swift b/Packages/TenMatch/Sources/MembershipFeature/InvitationCodeCampaign.swift deleted file mode 100644 index 394a0931..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/InvitationCodeCampaign.swift +++ /dev/null @@ -1,55 +0,0 @@ -import ComposableArchitecture -import MembershipLogic -import Styleguide -import SwiftUI - -public struct InvitationCodeCampaignView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 16) { - Image(String(localized: "invite-ticket", bundle: .module), bundle: .module) - .resizable() - .aspectRatio(contentMode: .fit) - .overlay(alignment: .center) { - Text(viewStore.code) - .foregroundStyle(Color(0xFFFF_CC00)) - .font(.system(.largeTitle, design: .rounded, weight: .bold)) - .offset(x: -35, y: 8) - } - .onTapGesture { - store.send(.invitationCodeButtonTapped) - } - - Button { - store.send(.invitationCodeButtonTapped) - } label: { - Text("Send Invitation Code", bundle: .module) - } - .buttonStyle(ConversionSecondaryButtonStyle()) - } - .padding(.all, 16) - .multilineTextAlignment(.center) - .background(Color(uiColor: UIColor.secondarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .padding(.vertical, 24) - .background() - } - } -} - -#Preview { - InvitationCodeCampaignView( - store: .init( - initialState: InvitationCodeCampaignLogic.State(code: "ABCDEF"), - reducer: { InvitationCodeCampaignLogic() } - ) - ) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/MembershipFeature/Localizable.xcstrings deleted file mode 100644 index 38561455..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Localizable.xcstrings +++ /dev/null @@ -1,778 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "%@ for %@" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "%1$@ for %2$@" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "が%2$@%1$@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@을 위해 %2$@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ pour %2$@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ za %2$@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ cho %2$@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "%1$@ por %2$@" - } - } - } - }, - "1. Send invitation code" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "1.招待コードを送る" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "1. 초대 코드 보내기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "1. Envoyer le code d'invitation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "1. Wyślij kod zaproszenia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "1. Gửi mã mời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "1. Enviar código de invitación" - } - } - } - }, - "2. %@ free for both parties!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "2.お互いに%@無料!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "2. 양측 모두 %@ 무료!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "2. %@ gratuit pour les deux parties !" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "2. %@ za darmo dla obu stron!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "2. %@ miễn phí cho cả hai bên!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "2. ¡%@ gratis para ambas partes!" - } - } - } - }, - "Find someone you care about!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "で気になる人を見つけよう!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "당신이 신경 쓰는 사람을 찾아보세요!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trouvez quelqu'un qui vous tient à cœur !" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Znajdź kogoś, na kim ci zależy!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tìm ai đó bạn quan tâm!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Encuentra a alguien que te importe!" - } - } - } - }, - "How to Receive Benefits" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "特典の受け取り方" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "혜택을 받는 방법" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comment recevoir des avantages" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jak otrzymać korzyści" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cách nhận lợi ích" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cómo recibir beneficios" - } - } - } - }, - "image-see-who-sent-it" : { - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-ja" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-ko" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-fr" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-pl" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-vi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "see-who-sent-it-es" - } - } - } - }, - "Invite a friend and both receive" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待した人も、された人も" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "친구를 초대하고 둘 다 받으세요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invitez un ami et recevez tous les deux" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zaproś znajomego i obaj otrzymajcie" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mời một người bạn và cả hai cùng nhận" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Invita a un amigo y ambos reciban" - } - } - } - }, - "invite-ticket" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-ja" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-ko" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-fr" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-pl" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-vi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "invite-ticket-es" - } - } - } - }, - "Limited to first %lld Users" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "先着%lld名限定" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최초 %lld명의 사용자로 제한됨" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limité aux premiers %lld utilisateurs" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ograniczone do pierwszych %lld użytkowników" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Giới hạn cho %lld người dùng đầu tiên" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Limitado a los primeros %lld usuarios" - } - } - } - }, - "Premium Plan" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "10倍楽しめるプレミアムプラン" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프리미엄 플랜" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gói cao cấp" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - } - } - }, - "Recurring billing. You can cancel at any time. Payment will be charged to your iTunes account and your subscription will auto-renew at %@/week until you cancel in iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "定期課金。いつでもキャンセルできます。お支払いはiTunesアカウントに請求され、iTunes Storeの設定でキャンセルするまで、購読は%@/週で自動更新されます。ロック解除をタップすると、利用規約と自動更新に同意したことになります。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정기 결제. 언제든지 취소할 수 있습니다. 결제는 iTunes 계정으로 청구되며 iTunes Store 설정에서 취소할 때까지 구독이 %@/주로 자동 갱신됩니다. 잠금 해제를 탭하면 서비스 약관 및 자동 갱신에 동의하게 됩니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Le paiement sera débité de votre compte iTunes et votre abonnement sera automatiquement renouvelé à %@/semaine jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Déverrouiller, vous acceptez les Conditions de service et le renouvellement automatique." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Okresowe rozliczenia. Możesz anulować w dowolnym momencie. Płatność zostanie obciążona na Twoim koncie iTunes i Twoja subskrypcja będzie automatycznie odnawiana na %@/tydzień, dopóki nie anulujesz w ustawieniach iTunes Store. Dotykając Odblokuj, zgadzasz się na Warunki korzystania z usługi i automatyczne odnawianie." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lập hóa đơn định kỳ. Bạn có thể hủy bất cứ lúc nào. Thanh toán sẽ được tính vào tài khoản iTunes của bạn và đăng ký của bạn sẽ tự động gia hạn ở mức %@/tuần cho đến khi bạn hủy trong cài đặt của iTunes Store. Bằng cách nhấn Mở khóa, bạn đồng ý với Điều khoản Dịch vụ và tự động gia hạn." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Facturación recurrente. Puedes cancelar en cualquier momento. El pago se cargará a tu cuenta de iTunes y tu suscripción se renovará automáticamente a %@/semana hasta que canceles en la configuración de la tienda de iTunes. Al tocar Desbloquear, aceptas los Términos de servicio y la renovación automática." - } - } - } - }, - "See who sent it!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "自分をLikeした人を見れる!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누가 보냈는지 확인하세요!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voir qui l'a envoyé !" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zobacz kto to wysłał!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xem ai đã gửi nó!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Mira quién lo envió!" - } - } - } - }, - "Send an invitation code to a friend who hasn't used TenMatch" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "まだTenMatchを使っていない友達に招待コードを贈りましょう!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "아직 TenMatch을 사용하지 않은 친구에게 초대 코드를 보내세요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoyez un code d'invitation à un ami qui n'a pas utilisé TenMatch" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyślij kod zaproszenia do znajomego, który nie używał TenMatch" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gửi mã mời đến một người bạn chưa sử dụng TenMatch" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envía un código de invitación a un amigo que no ha usado TenMatch" - } - } - } - }, - "Send Invitation Code" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待コードを送る" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "초대 코드 보내기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoyer le code d'invitation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyślij kod zaproszenia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gửi mã mời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar código de invitación" - } - } - } - }, - "Special offer" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "️うれしい特典" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "특별 제공" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Offre spéciale" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Specjalna oferta" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ưu đãi đặc biệt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Oferta especial" - } - } - } - }, - "Upgrade for %@/week" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける - %@/週" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "업그레이드 - %@/주" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mettre à niveau pour %@/semaine" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Uaktualnij za %@/tydzień" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nâng cấp cho %@/tuần" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Actualizar por %@/semana" - } - } - } - }, - "When they enter the Invitation Code and register, you will both receive TenMatch PRO for sure!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "相手が招待コードを入力して登録すると、お互いにTenMatch PROを必ずプレゼント!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상대가 초대 코드를 입력하고 등록하면, 둘 다 TenMatch PRO를 받을 수 있습니다!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lorsqu'ils saisissent le code d'invitation et s'inscrivent, vous recevrez tous les deux TenMatch PRO pour sûr !" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kiedy wprowadzą kod zaproszenia i zarejestrują się, obaj otrzymacie TenMatch PRO na pewno!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khi họ nhập mã mời và đăng ký, cả hai bạn sẽ nhận được TenMatch PRO chắc chắn!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Cuando ingresen el código de invitación y se registren, ambos recibirán TenMatch PRO seguro!" - } - } - } - }, - "when they use your invitation code you get" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "友達があなたの招待コードを\n入力すると、お互いに" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "그들이 당신의 초대 코드를 사용하면 당신은" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "lorsqu'ils utilisent votre code d'invitation, vous obtenez" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "kiedy używają twojego kodu zaproszenia, otrzymujesz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "khi họ sử dụng mã mời của bạn, bạn nhận được" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "cuando usan tu código de invitación, obtienes" - } - } - } - }, - "worth benefits" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "の特典がお互いにもらえる!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상당한 혜택" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "d'avantages" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "korzyści warte" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "những lợi ích đáng giá" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "beneficios por valor de" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/Membership.swift b/Packages/TenMatch/Sources/MembershipFeature/Membership.swift deleted file mode 100644 index 9a5b15ba..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/Membership.swift +++ /dev/null @@ -1,90 +0,0 @@ -import ActivityView -import ComposableArchitecture -import MembershipLogic -import ProductPurchaseFeature -import SwiftUI - -public struct MembershipView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStack { - WithViewStore(store, observe: { $0 }) { viewStore in - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - case .campaign: - CaseLet( - /MembershipLogic.Child.State.campaign, - action: MembershipLogic.Child.Action.campaign, - then: MembershipCampaignView.init(store:) - ) - case .purchase: - CaseLet( - /MembershipLogic.Child.State.purchase, - action: MembershipLogic.Child.Action.purchase, - then: MembershipPurchaseView.init(store:) - ) - } - } - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .alert(store: store.scope(state: \.$destination.alert, action: \.destination.alert)) - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .font(.system(size: 12, weight: .regular)) - .frame(width: 32, height: 32) - .foregroundStyle(Color.primary) - .background(Color(uiColor: UIColor.quaternarySystemFill)) - .clipShape(Circle()) - } - } - } - .fullScreenCover( - store: store.scope(state: \.$destination.purchase, action: \.destination.purchase) - ) { store in - NavigationStack { - ProductPurchaseView(store: store) - } - } - .sheet(isPresented: viewStore.$isPresented) { - ActivityView( - activityItems: [viewStore.shareText], - applicationActivities: nil - ) { activityType, result, _, _ in - store.send( - .onCompletion( - MembershipLogic.CompletionWithItems( - activityType: activityType, - result: result - ) - ) - ) - } - .presentationDetents([.medium, .large]) - } - } - } - } -} - -#Preview { - MembershipView( - store: .init( - initialState: MembershipLogic.State(), - reducer: { MembershipLogic() } - ) - ) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/MembershipCampaign.swift b/Packages/TenMatch/Sources/MembershipFeature/MembershipCampaign.swift deleted file mode 100644 index 58fcdff0..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/MembershipCampaign.swift +++ /dev/null @@ -1,105 +0,0 @@ -import API -import ComposableArchitecture -import MembershipLogic -import SwiftUI - -public struct MembershipCampaignView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 16) { - ScrollView { - VStack(spacing: 0) { - InvitationCampaignView( - store: store.scope( - state: \.invitationCampaign, - action: \.invitationCampaign - ) - ) - - InvitationCampaignPriceView( - store: store.scope( - state: \.invitationCampaignPrice, - action: \.invitationCampaignPrice - ) - ) - - VStack(spacing: 60) { - InvitationCodeCampaignView( - store: store.scope( - state: \.invitationCodeCampaign, - action: \.invitationCodeCampaign - ) - ) - - SpecialOfferView() - - HowToReceiveBenefitView( - displayDuration: viewStore.displayDuration - ) - - PurchaseAboutView( - displayPrice: viewStore.displayPrice - ) - } - .padding(.horizontal, 16) - } - .padding(.bottom, 80) - } - - VStack(spacing: 16) { - Button { - store.send(.invitationCodeButtonTapped) - } label: { - Text("Send Invitation Code", bundle: .module) - } - .buttonStyle(ConversionPrimaryButtonStyle()) - - Button { - store.send(.upgradeButtonTapped) - } label: { - Text("Upgrade for \(viewStore.displayPrice)/week", bundle: .module) - } - .buttonStyle(ConversionSecondaryButtonStyle()) - } - .padding(.horizontal, 16) - .padding(.bottom, 36) - } - .background() - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - MembershipCampaignView( - store: .init( - initialState: MembershipCampaignLogic.State( - campaign: API.MembershipQuery.Data.ActiveInvitationCampaign( - _dataDict: DataDict( - data: [ - "id": "1", - "quantity": 2000, - "durationWeeks": 4, - ], - fulfilledFragments: [] - ) - ), - code: "ABCDEF", - displayPrice: "¥500", - displayDuration: "1 week", - currencyCode: "$", - specialOfferDisplayPrice: "$100" - ), - reducer: { MembershipCampaignLogic() } - ) - ) - .ignoresSafeArea() - .environment(\.colorScheme, .dark) -// .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/MembershipPurchase.swift b/Packages/TenMatch/Sources/MembershipFeature/MembershipPurchase.swift deleted file mode 100644 index 75ea3041..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/MembershipPurchase.swift +++ /dev/null @@ -1,101 +0,0 @@ -import ComposableArchitecture -import MembershipLogic -import Styleguide -import SwiftUI - -public struct MembershipPurchaseView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - var gradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFFE8_B423), - Color(0xFFF5_D068), - ], - startPoint: .leading, - endPoint: .trailing - ) - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ZStack(alignment: .top) { - Color.yellow - .frame(width: 190, height: 190) - .clipShape(Circle()) - .offset(y: -190) - .blur(radius: 64) - - VStack(spacing: 16) { - ScrollView { - VStack(spacing: 16) { - Text("Premium Plan", bundle: .module) - .font(.subheadline) - .fontWeight(.semibold) - .padding(.vertical, 6) - .padding(.horizontal, 12) - .overlay( - Capsule() - .stroke(Color.white, lineWidth: 1) - ) - - VStack(spacing: 24) { - Text("Find someone you care about!", bundle: .module) - .font(.system(.title2, weight: .bold)) - - Button { - store.send(.upgradeButtonTapped) - } label: { - Text("Upgrade for \(viewStore.displayPrice)/week", bundle: .module) - } - .buttonStyle(ConversionPrimaryButtonStyle()) - } - - SpecialOfferView() - - PurchaseAboutView( - displayPrice: viewStore.displayPrice - ) - } - .padding(.bottom, 48) - .padding(.horizontal, 16) - } - - Button { - store.send(.upgradeButtonTapped) - } label: { - Text("Upgrade for \(viewStore.displayPrice)/week", bundle: .module) - } - .buttonStyle(ConversionPrimaryButtonStyle()) - .padding(.horizontal, 16) - .padding(.bottom, 36) - } - .task { await store.send(.onTask).finish() } - } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - } -} - -#Preview { - NavigationStack { - MembershipPurchaseView( - store: .init( - initialState: MembershipPurchaseLogic.State( - displayPrice: "¥500" - ), - reducer: { MembershipPurchaseLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/PurchaseAbout.swift b/Packages/TenMatch/Sources/MembershipFeature/PurchaseAbout.swift deleted file mode 100644 index 5ed01566..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/PurchaseAbout.swift +++ /dev/null @@ -1,22 +0,0 @@ -import SwiftUI - -struct PurchaseAboutView: View { - let displayPrice: String - - var body: some View { - VStack(spacing: 8) { - Text("Recurring billing. You can cancel at any time. Payment will be charged to your iTunes account and your subscription will auto-renew at \(displayPrice)/week until you cancel in iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal.", bundle: .module) - .font(.caption) - .foregroundStyle(Color(uiColor: UIColor.tertiaryLabel)) - } - .background() - .multilineTextAlignment(.center) - } -} - -#Preview { - PurchaseAboutView( - displayPrice: "$2.99" - ) - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/MembershipFeature/SpecialOfferView.swift b/Packages/TenMatch/Sources/MembershipFeature/SpecialOfferView.swift deleted file mode 100644 index 6118ca04..00000000 --- a/Packages/TenMatch/Sources/MembershipFeature/SpecialOfferView.swift +++ /dev/null @@ -1,52 +0,0 @@ -import Styleguide -import SwiftUI - -public struct SpecialOfferView: View { - @Environment(\.locale) var locale - - public var body: some View { - VStack(spacing: 16) { - Text("Special offer", bundle: .module) - .font(.system(.title2, weight: .bold)) - .padding(.vertical, 8) - .padding(.horizontal, 12) - .background( - LinearGradient( - colors: [ - Color.black, - Color.yellow, - ], - startPoint: .top, - endPoint: .bottom - ) - ) - .clipShape(RoundedRectangle(cornerRadius: 6)) - - VStack(spacing: 24) { - Text("See who sent it!", bundle: .module) - .font(.system(.title2, weight: .bold)) - - Image(String(localized: "image-see-who-sent-it", bundle: .module), bundle: .module) - .resizable() - .aspectRatio(contentMode: .fit) - } - } - .padding(.top, 36) - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .background(Color(uiColor: UIColor.secondarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 16)) - .overlay( - RoundedRectangle(cornerRadius: 16) - .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 0.5) - ) - } -} - -#Preview { - NavigationStack { - SpecialOfferView() - } - .environment(\.colorScheme, .dark) -// .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipStatusFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/MembershipStatusFeature/Localizable.xcstrings deleted file mode 100644 index adfd9817..00000000 --- a/Packages/TenMatch/Sources/MembershipStatusFeature/Localizable.xcstrings +++ /dev/null @@ -1,446 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "About TenMatch PRO" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PROについて" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO에 대하여" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "À propos de TenMatch PRO" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "O TenMatch PRO" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Về TenMatch PRO" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Acerca de TenMatch PRO" - } - } - } - }, - "App Store" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "App Store" - } - } - } - }, - "TenMatch PRO" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO" - } - } - } - }, - "Cancellation" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PROの解約" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch PRO의 취소" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annulation de TenMatch PRO" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anulowanie TenMatch PRO" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hủy TenMatch PRO" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelación de TenMatch PRO" - } - } - } - }, - "Expiration date" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "有効期限" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "만료 날짜" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Date d'expiration" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Data wygaśnięcia" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ngày hết hạn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fecha de vencimiento" - } - } - } - }, - "FREE" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "無料会員" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "무료 회원" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "GRATUIT" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "DARMOWY" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "MIỄN PHÍ" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "GRATIS" - } - } - } - }, - "Invitation Campaigns" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "招待キャンペーン" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "초대 캠페인" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Campagnes d'invitation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kampanie zaproszeniowe" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chiến dịch mời" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Campañas de invitación" - } - } - } - }, - "Membership Status" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "会員ステータス" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "회원 상태" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statut de membre" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status członkostwa" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tình trạng thành viên" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado de membresía" - } - } - } - }, - "Payment Method" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "支払い方法" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "결제 방법" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Méthode de paiement" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Metoda płatności" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phương thức thanh toán" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Método de pago" - } - } - } - }, - "Status" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ステータス" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "상태" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statut" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Status" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trạng thái" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Estado" - } - } - } - }, - "The subscription will be automatically cancelled upon expiration." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "有効期限を迎えると自動的に解約されます。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "구독은 만료 시 자동으로 취소됩니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "L'abonnement sera automatiquement annulé à l'expiration." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Subskrypcja zostanie automatycznie anulowana po wygaśnięciu." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đăng ký sẽ tự động bị hủy khi hết hạn." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "La suscripción se cancelará automáticamente al vencimiento." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatus.swift b/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatus.swift deleted file mode 100644 index b9c3aba3..00000000 --- a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatus.swift +++ /dev/null @@ -1,57 +0,0 @@ -import ComposableArchitecture -import MembershipStatusLogic -import SwiftUI - -public struct MembershipStatusView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .free: - CaseLet( - /MembershipStatusLogic.State.free, - action: MembershipStatusLogic.Action.free, - then: MembershipStatusFreeContentView.init(store:) - ) - - case .paid: - CaseLet( - /MembershipStatusLogic.State.paid, - action: MembershipStatusLogic.Action.paid, - then: MembershipStatusPaidContentView.init(store:) - ) - - case .campaign: - CaseLet( - /MembershipStatusLogic.State.campaign, - action: MembershipStatusLogic.Action.campaign, - then: MembershipStatusCampaignContentView.init(store:) - ) - } - } - .navigationTitle(String(localized: "Membership Status", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - } -} - -#Preview { - NavigationStack { - MembershipStatusView( - store: .init( - initialState: MembershipStatusLogic.State.loading, - reducer: { MembershipStatusLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift b/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift deleted file mode 100644 index 495b192a..00000000 --- a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusCampaignContent.swift +++ /dev/null @@ -1,54 +0,0 @@ -import ComposableArchitecture -import MembershipStatusLogic -import SwiftUI - -public struct MembershipStatusCampaignContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - List { - Section { - LabeledContent { - Text("TenMatch PRO", bundle: .module) - } label: { - Text("Status", bundle: .module) - } - - LabeledContent { - Text(viewStore.expireAt, format: .dateTime) - } label: { - Text("Expiration date", bundle: .module) - } - - LabeledContent { - Text("Invitation Campaigns", bundle: .module) - } label: { - Text("Payment Method", bundle: .module) - } - } footer: { - Text("The subscription will be automatically cancelled upon expiration.", bundle: .module) - } - } - } - } -} - -#Preview { - NavigationStack { - MembershipStatusCampaignContentView( - store: .init( - initialState: MembershipStatusCampaignContentLogic.State( - expireAt: .now - ), - reducer: { MembershipStatusCampaignContentLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift b/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift deleted file mode 100644 index c0624694..00000000 --- a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusFreeContent.swift +++ /dev/null @@ -1,56 +0,0 @@ -import ComposableArchitecture -import MembershipFeature -import MembershipStatusLogic -import SwiftUI - -public struct MembershipStatusFreeContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { _ in - List { - Section { - LabeledContent { - Text("FREE", bundle: .module) - } label: { - Text("Status", bundle: .module) - } - } - - Section { - Button { - store.send(.membershipButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("About TenMatch PRO", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } - } - .fullScreenCover( - store: store.scope(state: \.$destination.membership, action: \.destination.membership), - content: MembershipView.init(store:) - ) - } - } -} - -#Preview { - NavigationStack { - MembershipStatusFreeContentView( - store: .init( - initialState: MembershipStatusFreeContentLogic.State(), - reducer: { MembershipStatusFreeContentLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift b/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift deleted file mode 100644 index 1e2acbb3..00000000 --- a/Packages/TenMatch/Sources/MembershipStatusFeature/MembershipStatusPaidContent.swift +++ /dev/null @@ -1,65 +0,0 @@ -import ComposableArchitecture -import MembershipStatusLogic -import SwiftUI - -public struct MembershipStatusPaidContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - List { - Section { - LabeledContent { - Text("TenMatch PRO", bundle: .module) - } label: { - Text("Status", bundle: .module) - } - - LabeledContent { - Text(viewStore.expireAt, format: .dateTime) - } label: { - Text("Expiration date", bundle: .module) - } - - LabeledContent { - Text("App Store", bundle: .module) - } label: { - Text("Payment Method", bundle: .module) - } - } - - Section { - Button { - store.send(.cancellationButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Cancellation", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } - } - } - } -} - -#Preview { - NavigationStack { - MembershipStatusPaidContentView( - store: .init( - initialState: MembershipStatusPaidContentLogic.State( - expireAt: .now - ), - reducer: { MembershipStatusPaidContentLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/Contents.json b/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/Contents.json deleted file mode 100644 index c98c4be5..00000000 --- a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "message-active.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf b/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf deleted file mode 100644 index 4d033c0f..00000000 Binary files a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-active.imageset/message-active.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json b/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json deleted file mode 100644 index 8941a633..00000000 --- a/Packages/TenMatch/Sources/NavigationFeature/Assets.xcassets/message-deactive.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Chat.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/NavigationFeature/RootNavigation.swift b/Packages/TenMatch/Sources/NavigationFeature/RootNavigation.swift deleted file mode 100644 index 380dedae..00000000 --- a/Packages/TenMatch/Sources/NavigationFeature/RootNavigation.swift +++ /dev/null @@ -1,72 +0,0 @@ -import CategoryFeature -import ComposableArchitecture -import DirectMessageTabFeature -import NavigationLogic -import RecommendationFeature -import SwiftUI - -public struct RootNavigationView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - TabView(selection: viewStore.$tab) { - NavigationStack { - RecommendationView(store: store.scope(state: \.recommendation, action: \.recommendation)) - } - .tag(RootNavigationLogic.Tab.recommendation) - .tabItem { - Image( - viewStore.tab.is(\.recommendation) - ? ImageResource.recommendationActive - : ImageResource.recommendationDeactive - ) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 30, height: 30) - } - - CategoryView(store: store.scope(state: \.category, action: \.category)) - .tag(RootNavigationLogic.Tab.category) - .tabItem { - Image( - viewStore.tab.is(\.category) - ? ImageResource.explorerActive - : ImageResource.explorerDeactive - ) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 30, height: 30) - } - - DirectMessageTabView(store: store.scope(state: \.message, action: \.message)) - .tag(RootNavigationLogic.Tab.message) - .tabItem { - Image( - viewStore.tab.is(\.message) - ? ImageResource.messageActive - : ImageResource.messageDeactive - ) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 30, height: 30) - } - } - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - RootNavigationView( - store: .init( - initialState: RootNavigationLogic.State(), - reducer: { RootNavigationLogic() } - ) - ) - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/NetworkErrorFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/NetworkErrorFeature/Localizable.xcstrings deleted file mode 100644 index 010c82e8..00000000 --- a/Packages/TenMatch/Sources/NetworkErrorFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "NETWORK ERROR" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ネットワークエラー" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "네트워크 오류" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ERREUR RÉSEAU" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "BŁĄD SIECI" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "LỖI MẠNG" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "ERROR DE RED" - } - } - } - }, - "Servers are crowded. Please try restarting the application after a while." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "サーバーが混み合っています。しばらくしてからアプリの再起動をお試しください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "서버가 혼잡합니다. 잠시 후에 애플리케이션을 다시 시작해보세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les serveurs sont surchargés. Veuillez essayer de redémarrer l'application après un certain temps." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Serwery są przeciążone. Spróbuj ponownie uruchomić aplikację za chwilę." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Máy chủ đang quá tải. Vui lòng thử khởi động lại ứng dụng sau một thời gian." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Los servidores están congestionados. Por favor, intenta reiniciar la aplicación después de un rato." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/NetworkErrorFeature/NetworkError.swift b/Packages/TenMatch/Sources/NetworkErrorFeature/NetworkError.swift deleted file mode 100644 index fc310671..00000000 --- a/Packages/TenMatch/Sources/NetworkErrorFeature/NetworkError.swift +++ /dev/null @@ -1,41 +0,0 @@ -import ComposableArchitecture -import NetworkErrorLogic -import SwiftUI - -public struct NetworkErrorView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { _ in - VStack(spacing: 24) { - Text("NETWORK ERROR", bundle: .module) - .font(.system(.headline, design: .rounded, weight: .semibold)) - - Text("Servers are crowded. Please try restarting the application after a while.", bundle: .module) - .font(.system(.body, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - } - .padding(.horizontal, 16) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background() - .multilineTextAlignment(.center) - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - NavigationStack { - NetworkErrorView( - store: .init( - initialState: NetworkErrorLogic.State(), - reducer: { NetworkErrorLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings deleted file mode 100644 index 7c324205..00000000 --- a/Packages/TenMatch/Sources/NotificationsReEnableFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Activate" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "有効にする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "활성화" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aktywuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kích hoạt" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Activar" - } - } - } - }, - "You'll need to enable notifications to notice when you have a match." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マッチした時に気づくために通知を有効にしてね。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "매치가 되면 알림을 활성화해야 합니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous devrez activer les notifications pour remarquer lorsque vous avez un match." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Musisz włączyć powiadomienia, aby zauważyć, kiedy masz dopasowanie." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạn cần bật thông báo để biết khi nào bạn có một kết quả phù hợp." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Necesitarás habilitar las notificaciones para notar cuándo tienes una coincidencia." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift b/Packages/TenMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift deleted file mode 100644 index 2a6fbc2a..00000000 --- a/Packages/TenMatch/Sources/NotificationsReEnableFeature/NotificationsReEnable.swift +++ /dev/null @@ -1,47 +0,0 @@ -import ComposableArchitecture -import NotificationsReEnableLogic -import SwiftUI - -public struct NotificationsReEnableView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - HStack(spacing: 16) { - Image(systemName: "bell.fill") - .font(.system(size: 20, weight: .regular)) - - Text("You'll need to enable notifications to notice when you have a match.", bundle: .module) - .font(.system(.caption, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, alignment: .leading) - - Text("Activate", bundle: .module) - .font(.system(.caption2, design: .rounded, weight: .semibold)) - .padding(.vertical, 12) - .padding(.horizontal, 28) - .foregroundStyle(Color.black) - .background(Color.white) - .cornerRadius(12) - } - .padding(.vertical, 12) - .padding(.horizontal, 14) - .background(Color(uiColor: UIColor.tertiarySystemBackground)) - .cornerRadius(12) - .onTapGesture { - store.send(.onTapGesture) - } - } -} - -#Preview { - NotificationsReEnableView( - store: .init( - initialState: NotificationsReEnableLogic.State(), - reducer: { NotificationsReEnableLogic() } - ) - ) - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/OnboardFeature/Onboard.swift b/Packages/TenMatch/Sources/OnboardFeature/Onboard.swift deleted file mode 100644 index 417cd3fc..00000000 --- a/Packages/TenMatch/Sources/OnboardFeature/Onboard.swift +++ /dev/null @@ -1,71 +0,0 @@ -import ComposableArchitecture -import DisplayNameSettingFeature -import GenderSettingFeature -import HowToMovieFeature -import InvitationFeature -import OnboardLogic -import ProfilePictureSettingFeature -import SwiftUI -import UsernameSettingFeature - -public struct OnboardView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStackStore(store.scope(state: \.path, action: \.path)) { - UsernameSettingView(store: store.scope(state: \.username, action: \.username)) - } destination: { store in - switch store { - case .gender: - CaseLet( - /OnboardLogic.Path.State.gender, - action: OnboardLogic.Path.Action.gender, - then: { store in - GenderSettingView(store: store, nextButtonStyle: .next, canSkip: true) - } - ) - case .howToMovie: - CaseLet( - /OnboardLogic.Path.State.howToMovie, - action: OnboardLogic.Path.Action.howToMovie, - then: HowToMovieView.init(store:) - ) - case .profilePicture: - CaseLet( - /OnboardLogic.Path.State.profilePicture, - action: OnboardLogic.Path.Action.profilePicture, - then: { store in - ProfilePictureSettingView(store: store, nextButtonStyle: .next) - } - ) - case .displayName: - CaseLet( - /OnboardLogic.Path.State.displayName, - action: OnboardLogic.Path.Action.displayName, - then: { store in - DisplayNameSettingView(store: store) - } - ) - case .invitation: - CaseLet( - /OnboardLogic.Path.State.invitation, - action: OnboardLogic.Path.Action.invitation, - then: InvitationView.init(store:) - ) - } - } - .tint(Color.white) - .task { await store.send(.onTask).finish() } - .sheet( - store: store.scope(state: \.$destination.howToMovie, action: \.destination.howToMovie) - ) { store in - NavigationStack { - HowToMovieView(store: store) - } - } - } -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf b/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf deleted file mode 100644 index 9fa265c5..00000000 Binary files a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Center Content.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index befab51d..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Center Content.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings deleted file mode 100644 index 66d713ad..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/Localizable.xcstrings +++ /dev/null @@ -1,206 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - } - } - }, - "most popular" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "いちばん人気" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가장 인기 있는" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "le plus populaire" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "najbardziej popularny" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "phổ biến nhất" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "más popular" - } - } - } - }, - "Premium Plan" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "10倍楽しめるプレミアムプラン" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프리미엄 플랜" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gói cao cấp" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Plan Premium" - } - } - } - }, - "Recurring billing. You can cancel at any time. Your payment will be charged to your iTunes account and will auto-renew until you cancel in the iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "定期課金。いつでもキャンセルできます。お支払いはiTunesアカウントに請求され、iTunes Storeの設定でキャンセルするまで、自動更新されます。ロック解除をタップすると、利用規約と自動更新に同意したことになります。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정기 결제. 언제든지 취소할 수 있습니다. 결제는 iTunes 계정으로 청구되며 iTunes 스토어 설정에서 취소할 때까지 자동 갱신됩니다. 잠금을 해제하면 서비스 약관 및 자동 갱신에 동의하게 됩니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Facturation récurrente. Vous pouvez annuler à tout moment. Votre paiement sera débité de votre compte iTunes et sera renouvelé automatiquement jusqu'à ce que vous annuliez dans les paramètres de l'iTunes Store. En appuyant sur Déverrouiller, vous acceptez les Conditions d'utilisation et le renouvellement automatique." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Okresowe rozliczenia. Możesz anulować w dowolnym momencie. Twoja płatność zostanie obciążona na Twoim koncie iTunes i będzie automatycznie odnawiana, dopóki nie anulujesz w ustawieniach sklepu iTunes Store. Dotykając Odblokuj, zgadzasz się na Warunki korzystania z usługi i automatyczne odnawianie." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lập hóa đơn định kỳ. Bạn có thể hủy bất cứ lúc nào. Thanh toán của bạn sẽ được tính vào tài khoản iTunes của bạn và sẽ tự động gia hạn cho đến khi bạn hủy trong cài đặt của iTunes Store. Bằng cách nhấn Mở khóa, bạn đồng ý với Điều khoản dịch vụ và tự động gia hạn." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Facturación recurrente. Puedes cancelar en cualquier momento. Su pago se cargará a su cuenta de iTunes y se renovará automáticamente hasta que cancele en la configuración de la tienda de iTunes. Al tocar Desbloquear, acepta los Términos de servicio y la renovación automática." - } - } - } - }, - "See who likes you" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "自分をLikeした人を見れる!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "당신을 좋아하는 사람을 확인하세요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voir qui vous aime" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zobacz, kto cię lubi" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xem ai thích bạn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ver quién te gusta" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchase.swift b/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchase.swift deleted file mode 100644 index 00d91008..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchase.swift +++ /dev/null @@ -1,60 +0,0 @@ -import ComposableArchitecture -import ProductPurchaseLogic -import SwiftUI - -public struct ProductPurchaseView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .content: - CaseLet( - /ProductPurchaseLogic.State.content, - action: ProductPurchaseLogic.Action.content, - then: ProductPurchaseContentView.init(store:) - ) - } - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .font(.system(size: 12, weight: .regular)) - .frame(width: 32, height: 32) - .foregroundStyle(Color.primary) - .background(Color(uiColor: UIColor.quaternarySystemFill)) - .clipShape(Circle()) - } - } - } - } -} - -#Preview { - NavigationStack { - ProductPurchaseView( - store: .init( - initialState: ProductPurchaseLogic.State.loading, - reducer: { ProductPurchaseLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift b/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift deleted file mode 100644 index 57b5bf72..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContent.swift +++ /dev/null @@ -1,100 +0,0 @@ -import ComposableArchitecture -import ProductPurchaseLogic -import StoreKit -import Styleguide -import SwiftUI - -public struct ProductPurchaseContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ZStack(alignment: .top) { - Color.yellow - .frame(width: 190, height: 190) - .clipShape(Circle()) - .offset(y: -190) - .blur(radius: 64) - - VStack(spacing: 0) { - ScrollView(.vertical) { - VStack(spacing: 16) { - Text("Premium Plan", bundle: .module) - .font(.subheadline) - .fontWeight(.semibold) - .padding(.vertical, 6) - .padding(.horizontal, 12) - .overlay( - Capsule() - .stroke(Color.white, lineWidth: 1) - ) - - Text("See who likes you", bundle: .module) - .font(.title2) - .fontWeight(.bold) - - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: ProductPurchaseContentRowView.init(store:) - ) - - Button { - store.send(.restoreButtonTapped) - } label: { - Text("Restore a purchase", bundle: .module) - .font(.system(.footnote, weight: .semibold)) - } - - Text("Recurring billing. You can cancel at any time. Your payment will be charged to your iTunes account and will auto-renew until you cancel in the iTunes Store settings. By tapping Unlock, you agree to the Terms of Service and auto-renewal.", bundle: .module) - .font(.caption) - .foregroundStyle(Color(uiColor: UIColor.tertiaryLabel)) - } - .padding(.bottom, 16) - .padding(.horizontal, 16) - } - - PrimaryButton( - String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.isActivityIndicatorVisible - ) { - store.send(.purchaseButtonTapped, animation: .default) - } - .padding(.bottom, 16) - .padding(.horizontal, 16) - } - } - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .overlay { - if viewStore.isActivityIndicatorVisible { - ProgressView() - .tint(Color.white) - .progressViewStyle(CircularProgressViewStyle()) - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background(Color.black.opacity(0.6)) - } - } - .alert(store: store.scope(state: \.$destination.alert, action: \.destination.alert)) - } - } -} - -#Preview { - NavigationStack { - ProductPurchaseContentView( - store: .init( - initialState: ProductPurchaseContentLogic.State( - appAccountToken: UUID(), - products: [] - ), - reducer: { ProductPurchaseContentLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContentRow.swift b/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContentRow.swift deleted file mode 100644 index bea48dd3..00000000 --- a/Packages/TenMatch/Sources/ProductPurchaseFeature/ProductPurchaseContentRow.swift +++ /dev/null @@ -1,79 +0,0 @@ -import ComposableArchitecture -import ProductPurchaseLogic -import StoreKit -import Styleguide -import SwiftUI - -public struct ProductPurchaseContentRowView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.rowButtonTapped, animation: .default) - } label: { - HStack(spacing: 0) { - Text(viewStore.period.displayName) - .font(.headline) - .fontWeight(.semibold) - .frame(maxWidth: .infinity, alignment: .leading) - - VStack(alignment: .trailing, spacing: 4) { - if let displayPrice = viewStore.displayPrice { - Text(displayPrice) - .font(.callout) - .fontWeight(.semibold) - .foregroundStyle(Color.secondary) - .overlay(alignment: .center) { - Color.secondary - .frame(height: 2) - } - } - - Text(viewStore.displayPriceWithPeriod) - .font(.callout) - .fontWeight(.semibold) - } - } - .padding(.horizontal, 16) - .frame(minHeight: 80) - .background(Color(uiColor: UIColor.quaternarySystemFill)) - .clipShape(RoundedRectangle(cornerRadius: 12)) - .overlay( - viewStore.isSelected - ? RoundedRectangle(cornerRadius: 12) - .stroke(Color.yellow, lineWidth: 2.0) - : RoundedRectangle(cornerRadius: 12) - .stroke(Color(uiColor: UIColor.opaqueSeparator), lineWidth: 1.0) - ) - .overlay(alignment: .topTrailing) { - if viewStore.isSelected { - Image(systemName: "checkmark") - .foregroundStyle(Color.black) - .frame(width: 32, height: 32) - .background(Color.yellow) - .clipShape(Circle()) - .offset(x: 8, y: -8) - } - } - .overlay(alignment: .topLeading) { - if viewStore.isMostPopularFlag { - Text("most popular", bundle: .module) - .padding(.vertical, 6) - .padding(.horizontal, 12) - .background(Color.yellow) - .foregroundStyle(Color.black) - .font(.caption) - .fontWeight(.heavy) - .cornerRadius(12, corners: [.topLeft, .bottomRight]) - } - } - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/TenMatch/Sources/ProfileEditFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ProfileEditFeature/Localizable.xcstrings deleted file mode 100644 index 276b2654..00000000 --- a/Packages/TenMatch/Sources/ProfileEditFeature/Localizable.xcstrings +++ /dev/null @@ -1,501 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Approved" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aprobado" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Approuvé" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "承認済み" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "승인됨" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zatwierdzone" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đã phê duyệt" - } - } - } - }, - "Edit Profile" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Editar perfil" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le profil" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール編集" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 수정" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Edytuj profil" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chỉnh sửa hồ sơ" - } - } - } - }, - "Gender" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Género" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Genre" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "性別" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "성별" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Płeć" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Giới tính" - } - } - } - }, - "In Review" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "En revisión" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En révision" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "審査中" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "검토 중" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W recenzji" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đang xem xét" - } - } - } - }, - "Nick Name" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Apodo" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Surnom" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ニックネーム" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "닉네임" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pseudonim" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Biệt danh" - } - } - } - }, - "No Set" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No establecido" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Non défini" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "未設定" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설정 안 됨" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie ustawione" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chưa đặt" - } - } - } - }, - "PROFILE" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "PERFIL" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "PROFIL" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "PROFIL" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "HỒ SƠ" - } - } - } - }, - "Profile Image" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Imagen de perfil" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Image de profil" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール画像" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 이미지" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zdjęcie profilowe" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ảnh hồ sơ" - } - } - } - }, - "Profile Picture" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Foto de perfil" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Photo de profil" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール画像" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 사진" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zdjęcie profilowe" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ảnh đại diện" - } - } - } - }, - "Rejected" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rechazado" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Rejeté" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "却下済み" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "거절됨" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Odrzucone" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đã từ chối" - } - } - } - }, - "Short Comment" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comentario breve" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Commentaire court" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ひとこと" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "짧은 댓글" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Krótki komentarz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bình luận ngắn" - } - } - } - }, - "tenten PIN" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenのPIN" - } - } - } - }, - "Username" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nombre de usuario" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nom d'utilisateur" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ユーザーネーム" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "사용자 이름" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nazwa użytkownika" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tên người dùng" - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/Packages/TenMatch/Sources/ProfileEditFeature/ProfileEdit.swift b/Packages/TenMatch/Sources/ProfileEditFeature/ProfileEdit.swift deleted file mode 100644 index 6f5207a2..00000000 --- a/Packages/TenMatch/Sources/ProfileEditFeature/ProfileEdit.swift +++ /dev/null @@ -1,147 +0,0 @@ -import ComposableArchitecture -import DisplayNameSettingFeature -import GenderSettingFeature -import HowToMovieFeature -import ProfileEditLogic -import ProfilePictureSettingFeature -import ShortCommentSettingFeature -import SwiftUI -import UsernameSettingFeature - -public struct ProfileEditView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - List { - Section { - Button { - store.send(.usernameSettingButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("tenten PIN", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.displayNameSettingButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Nick Name", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.genderSettingButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Gender", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.pictureSettingButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Profile Picture", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.shortCommentButtonTapped) - } label: { - LabeledContent { - HStack { - ShortCommentStatus(status: viewStore.user?.shortComment?.status.value) - Image(systemName: "chevron.right") - } - } label: { - Text("Short Comment", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } header: { - Text("PROFILE", bundle: .module) - } - } - .multilineTextAlignment(.center) - .navigationTitle(String(localized: "Edit Profile", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "xmark") - .bold() - .foregroundStyle(Color.white) - } - } - } - .sheet( - store: store.scope( - state: \.$destination.howToMovie, - action: \.destination.howToMovie - ) - ) { store in - NavigationStack { - HowToMovieView(store: store) - } - } - .navigationDestination( - store: store.scope( - state: \.$destination.genderSetting, - action: \.destination.genderSetting - ) - ) { store in - GenderSettingView(store: store, nextButtonStyle: .save, canSkip: false) - } - .navigationDestination( - store: store.scope( - state: \.$destination.usernameSetting, - action: \.destination.usernameSetting - ), - destination: UsernameSettingView.init(store:) - ) - .navigationDestination( - store: store.scope( - state: \.$destination.pictureSetting, - action: \.destination.pictureSetting - ) - ) { store in - ProfilePictureSettingView(store: store, nextButtonStyle: .save) - } - .navigationDestination( - store: store.scope( - state: \.$destination.shortComment, - action: \.destination.shortComment - ), - destination: ShortCommentSettingView.init(store:) - ) - .navigationDestination( - store: store.scope( - state: \.$destination.displayNameSetting, - action: \.destination.displayNameSetting - ), - destination: DisplayNameSettingView.init(store:) - ) - } - } -} diff --git a/Packages/TenMatch/Sources/ProfileEditFeature/ShortCommentStatus.swift b/Packages/TenMatch/Sources/ProfileEditFeature/ShortCommentStatus.swift deleted file mode 100644 index 343cffa5..00000000 --- a/Packages/TenMatch/Sources/ProfileEditFeature/ShortCommentStatus.swift +++ /dev/null @@ -1,61 +0,0 @@ -import API -import SwiftUI - -struct ShortCommentStatus: View { - let status: API.ShortCommentStatus? - - var body: some View { - switch status { - case .inReview: - Text("In Review", bundle: .module) - .foregroundStyle(Color.yellow) - - case .approved: - Text("Approved", bundle: .module) - .foregroundStyle(Color.green) - - case .rejected: - Text("Rejected", bundle: .module) - .foregroundStyle(Color.red) - - default: - Text("No Set", bundle: .module) - } - } -} - -#Preview { - NavigationStack { - List { - Section { - ForEach([nil] + API.ShortCommentStatus.allCases, id: \.self) { status in - LabeledContent { - HStack { - ShortCommentStatus(status: status) - Image(systemName: "chevron.right") - } - } label: { - Text("Short Comment", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } - - Section { - ForEach([nil] + API.ShortCommentStatus.allCases, id: \.self) { status in - LabeledContent { - HStack { - ShortCommentStatus(status: status) - Image(systemName: "chevron.right") - } - } label: { - Text("Short Comment", bundle: .module) - .foregroundStyle(Color.primary) - } - .environment(\.locale, Locale(identifier: "ja-JP")) - } - } - } - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings deleted file mode 100644 index 7e84ce76..00000000 --- a/Packages/TenMatch/Sources/ProfileExplorerFeature/Localizable.xcstrings +++ /dev/null @@ -1,288 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Add tenten" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenを追加する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "로켓 추가" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ajouter un tenten" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Dodaj tenten" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thêm tenten" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Agregar tenten" - } - } - } - }, - "Block" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ブロックする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "차단" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blokuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chặn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquear" - } - } - } - }, - "Cancel" : { - "extractionState" : "manual", - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キャンセル" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "취소" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Anuluj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hủy bỏ" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cancelar" - } - } - } - }, - "I confirmed transmission" : { - "extractionState" : "manual", - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "確認して送信" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "전송 확인" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmission confirmée" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Potwierdzenie wysłania" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tôi đã xác nhận truyền tải" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Transmisión confirmada" - } - } - } - }, - "Message" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メッセージ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메시지" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wiadomość" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tin nhắn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mensaje" - } - } - } - }, - "Report" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通報" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "신고" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signaler" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zgłoś" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Báo cáo" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reportar" - } - } - } - }, - "Unmatch" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "マッチを解除" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "언매치" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Annuler la correspondance" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Usuń dopasowanie" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hủy ghép đôi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desemparejar" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift b/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift deleted file mode 100644 index cc794eef..00000000 --- a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorer.swift +++ /dev/null @@ -1,132 +0,0 @@ -import ComposableArchitecture -import DirectMessageFeature -import ProfileExplorerLogic -import ReportFeature -import SwiftUI - -public struct ProfileExplorerView: View { - @FocusState var focus: Bool - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 0) { - TabView(selection: viewStore.$currentTab) { - DirectMessageView(store: store.scope(state: \.directMessage, action: \.directMessage)) - .tag(ProfileExplorerLogic.Tab.message) - - ProfileExplorerPreviewView(store: store.scope(state: \.preview, action: \.preview)) - .tag(ProfileExplorerLogic.Tab.profile) - } - .onTapGesture { - focus = false - } - - HStack(spacing: 8) { - TextField( - text: viewStore.$text, - axis: .vertical - ) { - Text("Message", bundle: .module) - } - .focused($focus) - .lineLimit(1 ... 10) - .padding(.vertical, 8) - .padding(.horizontal, 16) - .tint(Color.white) - .background(Color(uiColor: UIColor.tertiarySystemBackground)) - .clipShape(RoundedRectangle(cornerRadius: 26)) - - Button { - store.send(.sendButtonTapped, animation: .default) - } label: { - Image(systemName: "paperplane.fill") - .foregroundStyle(Color.primary) - } - .disabled(viewStore.isDisabled) - } - .padding(.vertical, 8) - .padding(.horizontal, 16) - } - .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar(.hidden, for: .tabBar) - .toolbar { - ToolbarItem(placement: .principal) { - Button { - store.send(.principalButtonTapped, animation: .default) - } label: { - Text(viewStore.displayName) - .foregroundStyle(Color.primary) - .font(.system(.callout, design: .rounded, weight: .semibold)) - } - } - - ToolbarItem(placement: .topBarTrailing) { - Menu { - Button(role: .destructive) { - store.send(.unmatchButtonTapped) - } label: { - Label { - Text("Unmatch", bundle: .module) - } icon: { - Image(systemName: "trash") - } - } - - Button { - store.send(.reportButtonTapped) - } label: { - Label { - Text("Report", bundle: .module) - } icon: { - Image(systemName: "exclamationmark.triangle") - } - } - - Button { - store.send(.blockButtonTapped) - } label: { - Text("Block", bundle: .module) - } - } label: { - Image(systemName: "ellipsis") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - .sheet( - store: store.scope(state: \.$destination.report, action: \.destination.report), - content: ReportView.init(store:) - ) - .confirmationDialog( - store: store.scope( - state: \.$destination.confirmationDialog, - action: \.destination.confirmationDialog - ) - ) - } - } -} - -#Preview { - NavigationStack { - ProfileExplorerView( - store: .init( - initialState: ProfileExplorerLogic.State( - displayName: "tomokisun", - targetUserId: "id" - ), - reducer: { ProfileExplorerLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreview.swift b/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreview.swift deleted file mode 100644 index 03e93065..00000000 --- a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreview.swift +++ /dev/null @@ -1,29 +0,0 @@ -import ComposableArchitecture -import ProfileExplorerLogic -import SwiftUI - -public struct ProfileExplorerPreviewView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .content: - CaseLet( - /ProfileExplorerPreviewLogic.Child.State.content, - action: ProfileExplorerPreviewLogic.Child.Action.content, - then: ProfileExplorerPreviewContentView.init(store:) - ) - } - } - .task { await store.send(.onTask).finish() } - } -} diff --git a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift b/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift deleted file mode 100644 index 77cdaa29..00000000 --- a/Packages/TenMatch/Sources/ProfileExplorerFeature/ProfileExplorerPreviewContent.swift +++ /dev/null @@ -1,27 +0,0 @@ -import ComposableArchitecture -import ProfileExplorerLogic -import ProfileSharedFeature -import Styleguide -import SwiftUI - -public struct ProfileExplorerPreviewContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - VStack(spacing: 24) { - PictureSliderView(store: store.scope(state: \.pictureSlider, action: \.pictureSlider)) - - PrimaryButton( - String(localized: "Add tenten", bundle: .module) - ) { - store.send(.addExternalProductButtonTapped) - } - .padding(.horizontal, 16) - } - .confirmationDialog(store: store.scope(state: \.$confirmationDialog, action: \.confirmationDialog)) - } -} diff --git a/Packages/TenMatch/Sources/ProfileFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ProfileFeature/Localizable.xcstrings deleted file mode 100644 index 0ecba151..00000000 --- a/Packages/TenMatch/Sources/ProfileFeature/Localizable.xcstrings +++ /dev/null @@ -1,46 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "🔗 %@" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "🔗 %@" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ProfileFeature/Profile.swift b/Packages/TenMatch/Sources/ProfileFeature/Profile.swift deleted file mode 100644 index ceeaea64..00000000 --- a/Packages/TenMatch/Sources/ProfileFeature/Profile.swift +++ /dev/null @@ -1,128 +0,0 @@ -import ComposableArchitecture -import ProfileLogic -import ProfileSharedFeature -import SwiftUI -import UsernameSettingFeature - -public struct ProfileView: View { - @State var translation: CGSize = .zero - @State var scaleEffect: Double = 1.0 - let store: StoreOf - let width = UIScreen.main.bounds.width - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack { - VStack(spacing: 56) { - HStack(spacing: 0) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "chevron.down") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - Spacer() - if let displayName = viewStore.currentUser?.displayName { - Text(displayName) - .foregroundStyle(Color.white) - .font(.system(.callout, design: .rounded, weight: .semibold)) - } else if let username = viewStore.currentUser?.berealUsername { - Text(username) - .foregroundStyle(Color.white) - .font(.system(.callout, design: .rounded, weight: .semibold)) - } - Spacer() - Spacer() - .frame(width: 44, height: 44) - } - .padding(.top, 56) - .padding(.horizontal, 16) - - VStack(spacing: 16) { - IfLetStore( - store.scope(state: \.pictureSlider, action: \.pictureSlider), - then: PictureSliderView.init(store:), - else: { - Color.black - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - } - ) - - if let url = viewStore.currentUser?.externalProductUrl { - Button { - store.send(.jumpExternalProductButtonTapped) - } label: { - Text("🔗 \(url)") - .font(.system(.caption)) - .foregroundStyle(Color.primary) - } - } - } - - Spacer() - } - .background(Color.black) - .cornerRadius(16) - .scaleEffect(scaleEffect) - .ignoresSafeArea() - } - .background(Material.ultraThin) - .presentationBackground(Color.clear) - .task { await store.send(.onTask).finish() } - .gesture( - DragGesture() - .onEnded { _ in - translation = .zero - scaleEffect = 1.0 - } - .onChanged { - translation = $0.translation - - let startValue = 0.85 - let endValue = 1.0 - - let clampedValue = min(max(translation.height, 0.0), 150.0) - let normalizedValue = clampedValue / 100.0 - - scaleEffect = startValue + (endValue - startValue) * (1.0 - normalizedValue) - - if translation.height > 150 { - store.send(.closeButtonTapped) - } - } - ) - .confirmationDialog( - store: store.scope( - state: \.$destination.confirmationDialog, - action: \.destination.confirmationDialog - ) - ) - .fullScreenCover( - store: store.scope(state: \.$destination.editUsername, action: \.destination.editUsername) - ) { childStore in - NavigationStack { - UsernameSettingView(store: childStore) - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.editUsernameCloseButtonTapped) - } label: { - Image(systemName: "xmark") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings deleted file mode 100644 index 6a448f99..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/Localizable.xcstrings +++ /dev/null @@ -1,167 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - } - } - }, - "It will be public 🌎" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Será público 🌎" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ce sera public 🌎" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "公開されます🌎" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "공개됩니다 🌎" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Będzie publiczne 🌎" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nó sẽ được công khai 🌎" - } - } - } - }, - "Save" : { - "extractionState" : "manual", - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guardar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enregistrer" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "저장" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zapisz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lưu" - } - } - } - }, - "Set your profile pic." : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Establece tu foto de perfil." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Définissez votre photo de profil." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール写真を設定してください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 사진을 설정하세요." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ustaw swoje zdjęcie profilowe." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đặt ảnh hồ sơ của bạn." - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift deleted file mode 100644 index 3e1a7509..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PhotoGrid.swift +++ /dev/null @@ -1,65 +0,0 @@ -import PhotosUI -import ProfilePictureSettingLogic -import Styleguide -import SwiftUI - -public struct PhotoGrid: View { - let state: PhotoGridState - @Binding var selection: [PhotosPickerItem] - let onDelete: () -> Void - - public var body: some View { - switch state { - case let .active(image): - Button(action: onDelete) { - Image(uiImage: image) - .resizable() - .aspectRatio(3 / 4, contentMode: .fill) - .clipped() - .clipShape(RoundedRectangle(cornerRadius: 10)) - } - .buttonStyle(HoldDownButtonStyle()) - case let .warning(image): - Button(action: onDelete) { - ZStack { - Image(uiImage: image) - .resizable() - - Color.black.opacity(0.8) - - Image(systemName: "exclamationmark.triangle.fill") - .frame(width: 32, height: 32) - .foregroundStyle(Color.yellow) - } - .aspectRatio(3 / 4, contentMode: .fill) - .clipped() - .clipShape(RoundedRectangle(cornerRadius: 10)) - } - .buttonStyle(HoldDownButtonStyle()) - case .empty: - PhotosPicker( - selection: $selection, - maxSelectionCount: 9, - selectionBehavior: .default, - preferredItemEncoding: .automatic - ) { - Color(uiColor: UIColor.secondarySystemFill) - .aspectRatio(3 / 4, contentMode: .fill) - .cornerRadius(10) - .overlay { - PlusIcon() - } - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} - -#Preview { - PhotoGrid( - state: .empty, - selection: .constant([]), - onDelete: {} - ) - .frame(width: 104) -} diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift deleted file mode 100644 index c3ef57c0..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/PlusIcon.swift +++ /dev/null @@ -1,16 +0,0 @@ -import Styleguide -import SwiftUI - -struct PlusIcon: View { - var body: some View { - Image(systemName: "plus") - .frame(width: 32, height: 32) - .foregroundStyle(Color.black) - .background(Color.white) - .clipShape(Circle()) - } -} - -#Preview { - PlusIcon() -} diff --git a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift b/Packages/TenMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift deleted file mode 100644 index a3d90c5c..00000000 --- a/Packages/TenMatch/Sources/ProfilePictureSettingFeature/ProfilePictureSetting.swift +++ /dev/null @@ -1,111 +0,0 @@ -import ComposableArchitecture -import PhotosUI -import ProfilePictureSettingLogic -import Styleguide -import SwiftUI - -public struct ProfilePictureSettingView: View { - public enum NextButtonStyle: Equatable { - case next - case save - } - - let store: StoreOf - private let nextButtonStyle: NextButtonStyle - - public init( - store: StoreOf, - nextButtonStyle: NextButtonStyle = .next - ) { - self.store = store - self.nextButtonStyle = nextButtonStyle - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 8) { - ScrollView { - VStack(spacing: 32) { - VStack(spacing: 8) { - Text("Set your profile pic.", bundle: .module) - .font(.system(.title2, design: .rounded, weight: .bold)) - - Text("It will be public 🌎", bundle: .module) - .font(.system(.footnote, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - } - - LazyVGrid( - columns: Array( - repeating: GridItem(spacing: 16), - count: 3 - ), - alignment: .center, - spacing: 16 - ) { - ForEach( - Array(viewStore.images.enumerated()), - id: \.offset - ) { offset, state in - PhotoGrid( - state: state, - selection: viewStore.$photoPickerItems, - onDelete: { - store.send(.onDelete(offset)) - } - ) - .id(offset) - } - } - } - .padding(.top, 24) - } - - PrimaryButton( - nextButtonStyle == .save - ? String(localized: "Save", bundle: .module) - : String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible - ) { - store.send(.nextButtonTapped) - } - } - .padding(.bottom, 16) - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - .alert( - store: store.scope( - state: \.$destination.alert, - action: \.destination.alert - ) - ) - .confirmationDialog( - store: store.scope( - state: \.$destination.confirmationDialog, - action: \.destination.confirmationDialog - ) - ) - } - } -} - -#Preview { - NavigationStack { - ProfilePictureSettingView( - store: .init( - initialState: ProfilePictureSettingLogic.State(), - reducer: { ProfilePictureSettingLogic() } - ), - nextButtonStyle: .next - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/ProfileSharedFeature/PictureSlider.swift b/Packages/TenMatch/Sources/ProfileSharedFeature/PictureSlider.swift deleted file mode 100644 index cf69987f..00000000 --- a/Packages/TenMatch/Sources/ProfileSharedFeature/PictureSlider.swift +++ /dev/null @@ -1,85 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import ProfileSharedLogic -import SelectControl -import SwiftUI - -public struct PictureSliderView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - let width = UIScreen.main.bounds.width - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 24) { - ForEach(viewStore.data.images, id: \.id) { picture in - if picture == viewStore.selection { - CachedAsyncImage( - url: URL(string: picture.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { content in - content - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - }, - placeholder: { - Color.black - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - } - } - .overlay(alignment: .top) { - SelectControl( - current: viewStore.selection, - items: viewStore.data.images - ) - .padding(.top, 8) - .padding(.horizontal, 40) - } - .overlay(alignment: .bottom) { - if let shortComment = viewStore.data.shortComment?.body { - Text(shortComment) - .padding(.vertical, 12) - .padding(.horizontal, 24) - .background(Material.ultraThin) - .clipShape(Capsule()) - .padding(.bottom, 16) - .padding(.horizontal, 32) - .multilineTextAlignment(.center) - .font(.system(.footnote, design: .rounded, weight: .semibold)) - } - } - .clipShape(RoundedRectangle(cornerRadius: 16)) - .frame(width: width, height: width * (4 / 3)) - .overlay { - HStack(spacing: 0) { - Color.clear - .contentShape(Rectangle()) - .onTapGesture { - store.send(.backButtonTapped) - } - - Color.clear - .contentShape(Rectangle()) - .onTapGesture { - store.send(.forwardButtonTapped) - } - } - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/PushNotificationSettingsFeature/Localizable.xcstrings deleted file mode 100644 index ce8d99f5..00000000 --- a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/Localizable.xcstrings +++ /dev/null @@ -1,118 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Message" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "メッセージ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "메시지" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Message" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tin nhắn" - } - } - } - }, - "New Like" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "新しいLike" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "새로운 좋아요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nouveau Like" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lượt thích mới" - } - } - } - }, - "New Match" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "新しいマッチ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "새로운 매치" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nouvelle correspondance" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ghép đôi mới" - } - } - } - }, - "Push Notifications" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プッシュ通知" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "푸시 알림" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Notifications push" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thông báo đẩy" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettings.swift b/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettings.swift deleted file mode 100644 index c44c9abe..00000000 --- a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettings.swift +++ /dev/null @@ -1,23 +0,0 @@ -import ComposableArchitecture -import PushNotificationSettingsLogic -import SwiftUI - -public struct PushNotificationSettingsView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - List { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: PushNotificationSettingsRowView.init(store:) - ) - } - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(String(localized: "Push Notifications", bundle: .module)) - .task { await store.send(.onTask).finish() } - } -} diff --git a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettingsRow.swift b/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettingsRow.swift deleted file mode 100644 index c7644cbb..00000000 --- a/Packages/TenMatch/Sources/PushNotificationSettingsFeature/PushNotificationSettingsRow.swift +++ /dev/null @@ -1,46 +0,0 @@ -import ComposableArchitecture -import PushNotificationSettingsLogic -import SwiftUI - -public struct PushNotificationSettingsRowView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Toggle( - isOn: viewStore.$allow - ) { - switch viewStore.pushNotificationKind { - case .case(.like): - Text("New Like", bundle: .module) - case .case(.match): - Text("New Match", bundle: .module) - case .case(.message): - Text("Message", bundle: .module) - default: - EmptyView() - } - } - .tint(Color.green) - } - } -} - -#Preview { - NavigationStack { - PushNotificationSettingsRowView( - store: .init( - initialState: PushNotificationSettingsRowLogic.State( - allow: true, - pushNotificationKind: .case(.like) - ), - reducer: { PushNotificationSettingsRowLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeRouterFeature/ReceivedLikeRouter.swift b/Packages/TenMatch/Sources/ReceivedLikeRouterFeature/ReceivedLikeRouter.swift deleted file mode 100644 index 5101be8e..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeRouterFeature/ReceivedLikeRouter.swift +++ /dev/null @@ -1,38 +0,0 @@ -import ComposableArchitecture -import MembershipFeature -import ReceivedLikeRouterLogic -import ReceivedLikeSwipeFeature -import SwiftUI - -public struct ReceivedLikeRouterView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .membership: - CaseLet( - /ReceivedLikeRouterLogic.State.membership, - action: ReceivedLikeRouterLogic.Action.membership, - then: MembershipView.init(store:) - ) - - case .swipe: - CaseLet( - /ReceivedLikeRouterLogic.State.swipe, - action: ReceivedLikeRouterLogic.Action.swipe, - then: ReceivedLikeSwipeView.init(store:) - ) - } - } - .task { await store.send(.onTask).finish() } - } -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/Contents.json b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/Contents.json deleted file mode 100644 index 08da8a12..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "empty.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/empty.pdf b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/empty.pdf deleted file mode 100644 index 5fd7c8fc..00000000 Binary files a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/empty.imageset/empty.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/Contents.json b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/Contents.json deleted file mode 100644 index 36798f70..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "heart.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/heart.pdf b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/heart.pdf deleted file mode 100644 index f47a1aea..00000000 Binary files a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/heart.imageset/heart.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/Contents.json b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/Contents.json deleted file mode 100644 index 41b779d8..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "xmark.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf deleted file mode 100644 index e89ac623..00000000 Binary files a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings deleted file mode 100644 index 3333fead..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Looks like he's gone." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "もういないみたい..." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "그는 떠난 것 같아요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "On dirait qu'il est parti." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wygląda na to, że go nie ma." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Có vẻ như anh ấy đã đi rồi." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Parece que se ha ido." - } - } - } - }, - "See who likes you" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "あなたをLikeした人" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누가 당신을 좋아하는지 확인하세요" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Voir qui vous aime" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zobacz, kto cię lubi" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xem ai thích bạn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ver quién te gusta" - } - } - } - }, - "Swipe others" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "他の人をスワイプする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "다른 사람들 스와이프" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Balayez les autres" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Przesuń innych" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt người khác" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desliza a otros" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift b/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift deleted file mode 100644 index a65a039f..00000000 --- a/Packages/TenMatch/Sources/ReceivedLikeSwipeFeature/ReceivedLikeSwipe.swift +++ /dev/null @@ -1,84 +0,0 @@ -import ComposableArchitecture -import MatchedFeature -import ReceivedLikeSwipeLogic -import Styleguide -import SwiftUI -import SwipeCardFeature -import SwipeFeature - -public struct ReceivedLikeSwipeView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStack { - SwitchStore(store.scope(state: \.child, action: \.child)) { initialState in - switch initialState { - case .loading: - Color.black - .overlay { - ProgressView() - .tint(Color.white) - } - - case .empty: - emptyView - - case .content: - CaseLet( - /ReceivedLikeSwipeLogic.Child.State.content, - action: ReceivedLikeSwipeLogic.Child.Action.content, - then: SwipeView.init(store:) - ) - } - } - .navigationTitle(String(localized: "See who likes you", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "chevron.down") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } - } - - private var emptyView: some View { - VStack(spacing: 24) { - Image(ImageResource.empty) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 120) - - Text("Looks like he's gone.", bundle: .module) - .font(.system(.title3, design: .rounded, weight: .semibold)) - - PrimaryButton( - String(localized: "Swipe others", bundle: .module) - ) { - store.send(.emptyButtonTapped) - } - } - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - } -} - -#Preview { - ReceivedLikeSwipeView( - store: .init( - initialState: ReceivedLikeSwipeLogic.State(), - reducer: { ReceivedLikeSwipeLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/Contents.json b/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/Contents.json deleted file mode 100644 index 4353078c..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "received-like.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/received-like.pdf b/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/received-like.pdf deleted file mode 100644 index bf79723a..00000000 Binary files a/Packages/TenMatch/Sources/RecentMatchFeature/Assets.xcassets/received-like.imageset/received-like.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/LikeGrid.swift b/Packages/TenMatch/Sources/RecentMatchFeature/LikeGrid.swift deleted file mode 100644 index efc29aee..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/LikeGrid.swift +++ /dev/null @@ -1,80 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import RecentMatchLogic -import Styleguide -import SwiftUI - -public struct LikeGridView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - var goldGradient: LinearGradient { - LinearGradient( - colors: [ - Color(0xFF9F0A), - Color(0xFFD60A), - ], - startPoint: .top, - endPoint: .bottom - ) - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.gridButtonTapped) - } label: { - VStack(spacing: 8) { - CachedAsyncImage( - url: URL(string: viewStore.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { image in - image - .resizable() - .aspectRatio(1, contentMode: .fill) - .blur(radius: 18) - }, - placeholder: { - Color.black - .aspectRatio(1, contentMode: .fill) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .cornerRadius(6) - .overlay { - RoundedRectangle(cornerRadius: 6) - .stroke(goldGradient, lineWidth: 3) - } - .overlay { - HStack(alignment: .center, spacing: 0) { - Text(Image(systemName: "heart.fill")) - .font(.system(size: 14)) - - Text(viewStore.receivedCount) - .font(.system(.body, design: .rounded, weight: .semibold)) - } - .foregroundStyle(Color.black) - .padding(.vertical, 4) - .padding(.horizontal, 6) - .background(goldGradient) - .clipShape(RoundedRectangle(cornerRadius: .infinity)) - } - - Text("Liked by \(viewStore.receivedCount) people", bundle: .module) - .foregroundStyle(Color.primary) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading) - } - } - } - } -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/RecentMatchFeature/Localizable.xcstrings deleted file mode 100644 index 5930c597..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Liked by %@ people" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@人にLikeされてます" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "%@명이 좋아합니다" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aimé par %@ personnes" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Polubione przez %@ osób" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Được %@ người thích" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "A %@ personas les gusta" - } - } - } - }, - "Recently Match" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "最近のマッチ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최근 매치" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correspondance récente" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ostatnio dopasowane" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khớp gần đây" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Emparejamiento reciente" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatch.swift b/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatch.swift deleted file mode 100644 index c6848952..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatch.swift +++ /dev/null @@ -1,34 +0,0 @@ -import ComposableArchitecture -import RecentMatchLogic -import SwiftUI - -public struct RecentMatchView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - Group { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - - case .content: - CaseLet( - /RecentMatchLogic.State.content, - action: RecentMatchLogic.Action.content, - then: RecentMatchContentView.init(store:) - ) - } - } - } - .task { await store.send(.onTask).finish() } - .toolbar(.visible, for: .tabBar) - .navigationBarTitleDisplayMode(.inline) - .navigationTitle(String(localized: "Recently Match", bundle: .module)) - } -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchContent.swift b/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchContent.swift deleted file mode 100644 index 59534a59..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchContent.swift +++ /dev/null @@ -1,57 +0,0 @@ -import ComposableArchitecture -import ProfileExplorerFeature -import ReceivedLikeRouterFeature -import RecentMatchLogic -import SwiftUI - -public struct RecentMatchContentView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ScrollView(.vertical) { - LazyVStack(spacing: 8) { - LazyVGrid( - columns: Array( - repeating: GridItem(spacing: 8), - count: 2 - ), - spacing: 16 - ) { - IfLetStore( - store.scope(state: \.likeGrid, action: \.likeGrid), - then: LikeGridView.init(store:) - ) - - ForEachStore( - store.scope(state: \.matches, action: \.matches), - content: RecentMatchGridView.init(store:) - ) - } - - if viewStore.hasNextPage { - ProgressView() - .tint(Color.white) - .frame(height: 44) - .frame(maxWidth: .infinity) - .task { await store.send(.scrollViewBottomReached).finish() } - } - } - .padding(.bottom, 24) - .padding(.horizontal, 16) - } - .fullScreenCover( - store: store.scope(state: \.$destination.likeRouter, action: \.destinatio.likeRouter), - content: ReceivedLikeRouterView.init(store:) - ) - .navigationDestination( - store: store.scope(state: \.$destination.explorer, action: \.destinatio.explorer), - destination: ProfileExplorerView.init(store:) - ) - } - } -} diff --git a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift b/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift deleted file mode 100644 index a32fc079..00000000 --- a/Packages/TenMatch/Sources/RecentMatchFeature/RecentMatchGrid.swift +++ /dev/null @@ -1,68 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import RecentMatchLogic -import Styleguide -import SwiftUI - -public struct RecentMatchGridView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - let width = UIScreen.main.bounds.width - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Button { - store.send(.matchButtonTapped) - } label: { - VStack(spacing: 8) { - CachedAsyncImage( - url: URL(string: viewStore.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { image in - image - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - }, - placeholder: { - Color.black - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - .overlay { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - } - } - ) - .clipShape(RoundedRectangle(cornerRadius: 6)) - .overlay(alignment: .bottom) { - if !viewStore.isRead { - Color(0xFFD60A) - .frame(width: 16, height: 16) - .clipShape(Circle()) - .offset(y: 8) - } - } - - VStack(spacing: 4) { - Text(viewStore.displayName) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, alignment: .leading) - - Text(viewStore.createdAt, format: Date.FormatStyle(date: .numeric)) - .foregroundStyle(Color.gray) - .font(.system(.caption2, design: .rounded, weight: .semibold)) - .frame(maxWidth: .infinity, alignment: .leading) - } - } - } - .buttonStyle(HoldDownButtonStyle()) - } - } -} diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Contents.json b/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Contents.json deleted file mode 100644 index dd0f1614..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/break.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "Frame 625063.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/RecommendationFeature/Localizable.xcstrings deleted file mode 100644 index 3f1fdbfc..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Share" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Compartir" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partager" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "シェアする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "공유" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Udostępnij" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chia sẻ" - } - } - } - }, - "Too much swiping...\nPlease help us share TenMatch... 🙏" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Demasiado deslizamiento...\nPor favor, ayúdanos a compartir TenMatch... 🙏" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trop de balayage...\nAidez-nous à partager TenMatch... 🙏" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ちょっと...スワイプしすぎです...。
TenMatchのシェアに協力してください... 🙏" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "너무 많이 스와이프...\n장신구 공유를 도와주세요... 🙏" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Za dużo przesuń...\nProszę, pomóż nam udostępnić TenMatch... 🙏" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quẹt quá nhiều...\nXin hãy giúp chúng tôi chia sẻ TenMatch... 🙏" - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/Packages/TenMatch/Sources/RecommendationFeature/Recommendation.swift b/Packages/TenMatch/Sources/RecommendationFeature/Recommendation.swift deleted file mode 100644 index b7ebc595..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/Recommendation.swift +++ /dev/null @@ -1,44 +0,0 @@ -import ComposableArchitecture -import RecommendationLogic -import SwiftUI -import SwipeFeature - -public struct RecommendationView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - SwitchStore(store) { initialState in - switch initialState { - case .loading: - ProgressView() - .tint(Color.white) - .progressViewStyle(CircularProgressViewStyle()) - - case .content: - CaseLet( - /RecommendationLogic.State.content, - action: RecommendationLogic.Action.content, - then: SwipeView.init(store:) - ) - - case .empty: - CaseLet( - /RecommendationLogic.State.empty, - action: RecommendationLogic.Action.empty, - then: RecommendationEmptyView.init(store:) - ) - } - } - .task { await store.send(.onTask).finish() } - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } -} diff --git a/Packages/TenMatch/Sources/RecommendationFeature/RecommendationEmpty.swift b/Packages/TenMatch/Sources/RecommendationFeature/RecommendationEmpty.swift deleted file mode 100644 index 3af33a1a..00000000 --- a/Packages/TenMatch/Sources/RecommendationFeature/RecommendationEmpty.swift +++ /dev/null @@ -1,91 +0,0 @@ -import ActivityView -import ComposableArchitecture -import RecommendationLogic -import Styleguide -import SwiftUI - -public struct RecommendationEmptyView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 40) { - Image(ImageResource.break) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(maxWidth: .infinity) - .padding(.horizontal, 37) - - VStack(spacing: 16) { - Text("Too much swiping...\nPlease help us share TenMatch... 🙏", bundle: .module) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.white) - .multilineTextAlignment(.center) - - Button { - store.send(.shareButtonTapped) - } label: { - Text("Share", bundle: .module) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(height: 50) - .frame(maxWidth: .infinity) - .foregroundStyle(Color.black) - .background(Color.white) - .cornerRadius(16) - } - .buttonStyle(HoldDownButtonStyle()) - } - .padding(.horizontal, 16) - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .background( - LinearGradient( - colors: [ - Color(0xFFB8_5BE9), - Color(0xFF00_0000), - ], - startPoint: .topTrailing, - endPoint: .bottomLeading - ) - ) - .task { await store.send(.onTask).finish() } - .sheet(isPresented: viewStore.$isPresented) { - ActivityView( - activityItems: [viewStore.shareText], - applicationActivities: nil - ) { activityType, result, _, _ in - store.send( - .onCompletion( - RecommendationEmptyLogic.CompletionWithItems( - activityType: activityType, - result: result - ) - ) - ) - } - .presentationDetents([.medium, .large]) - } - } - } -} - -#Preview { - NavigationStack { - RecommendationEmptyView( - store: .init( - initialState: RecommendationEmptyLogic.State(), - reducer: { RecommendationEmptyLogic() } - ) - ) - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - } - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/ReportFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ReportFeature/Localizable.xcstrings deleted file mode 100644 index ec2dfd00..00000000 --- a/Packages/TenMatch/Sources/ReportFeature/Localizable.xcstrings +++ /dev/null @@ -1,446 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Fake profile" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "偽のプロフィール" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "가짜 프로필" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Faux profil" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Fałszywy profil" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hồ sơ giả" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Perfil falso" - } - } - } - }, - "If you or someone you know is in immediate danger, contact local low enforcement or your local emergency services immediately." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "犯罪に関わる行為(殺害予告、援助交際、薬物売買など)は、警察に連絡してください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "당신이나 당신이 아는 사람이 즉각적인 위험에 처해 있다면, 즉시 지역 경찰 또는 응급 서비스에 연락하세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous ou quelqu'un que vous connaissez est en danger immédiat, contactez immédiatement les forces de l'ordre locales ou les services d'urgence." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jeśli Ty lub ktoś, kogo znasz, jest w bezpośrednim niebezpieczeństwie, natychmiast skontaktuj się z lokalnymi służbami porządkowymi lub ratunkowymi." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nếu bạn hoặc ai đó mà bạn biết đang gặp nguy hiểm ngay lập tức, hãy liên hệ ngay với cơ quan thực thi pháp luật địa phương hoặc dịch vụ khẩn cấp địa phương." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si usted o alguien que conoce está en peligro inmediato, contacte inmediatamente a las fuerzas del orden locales o a los servicios de emergencia." - } - } - } - }, - "Minimum of 10 characters required." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "10文字以上入力する必要があります。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "최소 10자 이상 입력해야 합니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Minimum de 10 caractères requis." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wymagane jest minimum 10 znaków." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Yêu cầu tối thiểu 10 ký tự." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Se requieren un mínimo de 10 caracteres." - } - } - } - }, - "Nudity or something sexualy explicit" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ヌードや性的に露骨な表現" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "누드 또는 성적으로 노골적인 내용" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nudité ou contenu sexuellement explicite" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nagość lub treści o charakterze seksualnym" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nội dung khỏa thân hoặc khiêu dâm" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Desnudez o contenido sexual explícito" - } - } - } - }, - "Other" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기타" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autre" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Inne" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khác" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Otro" - } - } - } - }, - "Report a TenMatch" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通報する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "트링켓 신고하기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signaler un TenMatch" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zgłoś TenMatch" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Báo cáo một TenMatch" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reportar un TenMatch" - } - } - } - }, - "Send" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "送信" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "보내기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Envoyer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Wyślij" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gửi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enviar" - } - } - } - }, - "Spam" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スパム" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "스팸" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spam" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Spam" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thư rác" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Correo no deseado" - } - } - } - }, - "Suicide or self-harm" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "自殺または自傷" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "자살 또는 자해" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suicide ou automutilation" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Samobójstwo lub samookaleczenie" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tự tử hoặc tự gây hại" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suicidio o autolesiones" - } - } - } - }, - "Violent or dangerous" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "暴力または危険" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "폭력적 또는 위험한" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Violent ou dangereux" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Gwałtowny lub niebezpieczny" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bạo lực hoặc nguy hiểm" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Violento o peligroso" - } - } - } - }, - "Your report is confidential." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ご報告の内容は秘密厳守で丁寧に管理いたします。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "신고 내용은 기밀로 처리됩니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Votre signalement est confidentiel." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Twoje zgłoszenie jest poufne." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Báo cáo của bạn được bảo mật." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Su informe es confidencial." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ReportFeature/Report.swift b/Packages/TenMatch/Sources/ReportFeature/Report.swift deleted file mode 100644 index e31a4560..00000000 --- a/Packages/TenMatch/Sources/ReportFeature/Report.swift +++ /dev/null @@ -1,86 +0,0 @@ -import ComposableArchitecture -import ReportLogic -import Styleguide -import SwiftUI - -public struct ReportView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - NavigationStackStore( - store.scope(state: \.path, action: \.path) - ) { - List( - [ - String(localized: "Spam", bundle: .module), - String(localized: "Nudity or something sexualy explicit", bundle: .module), - String(localized: "Violent or dangerous", bundle: .module), - String(localized: "Suicide or self-harm", bundle: .module), - String(localized: "Fake profile", bundle: .module), - String(localized: "Other", bundle: .module), - ], - id: \.self - ) { title in - Button { - store.send(.titleButtonTapped(title)) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text(title) - .foregroundStyle(Color.primary) - } - } - } - .navigationTitle(String(localized: "Report a TenMatch", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .toolbar { - ToolbarItem(placement: .topBarLeading) { - Button { - store.send(.closeButtonTapped) - } label: { - Image(systemName: "chevron.down") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - } - } - } - } destination: { store in - SwitchStore(store) { initialState in - switch initialState { - case .reason: - CaseLet( - /ReportLogic.Path.State.reason, - action: ReportLogic.Path.Action.reason, - then: ReportReasonView.init(store:) - ) - } - } - } - .tint(Color.white) - .task { await store.send(.onTask).finish() } - } -} - -#Preview { - Color.white - .sheet(isPresented: .constant(true)) { - ReportView( - store: .init( - initialState: ReportLogic.State( - targetUserId: String() - ), - reducer: { ReportLogic() } - ) - ) - .presentationDragIndicator(.visible) - .presentationDetents([.medium, .large]) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) - } -} diff --git a/Packages/TenMatch/Sources/ReportFeature/ReportReason.swift b/Packages/TenMatch/Sources/ReportFeature/ReportReason.swift deleted file mode 100644 index 595a5377..00000000 --- a/Packages/TenMatch/Sources/ReportFeature/ReportReason.swift +++ /dev/null @@ -1,79 +0,0 @@ -import ComposableArchitecture -import ReportLogic -import Styleguide -import SwiftUI - -public struct ReportReasonView: View { - @FocusState var focus: ReportReasonLogic.State.Field? - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(alignment: .leading, spacing: 16) { - VStack(alignment: .leading, spacing: 0) { - Text("Your report is confidential.", bundle: .module) - - Text("If you or someone you know is in immediate danger, contact local low enforcement or your local emergency services immediately.", bundle: .module) - .layoutPriority(1) - .frame(minHeight: 50) - } - .font(.system(.footnote, design: .rounded)) - - VStack(alignment: .leading, spacing: 8) { - TextEditor(text: viewStore.$text) - .frame(height: 140) - .lineLimit(1 ... 10) - .focused($focus, equals: .text) - .overlay( - RoundedRectangle(cornerRadius: 12) - .stroke(Color.primary, lineWidth: 1.0) - ) - - Text("Minimum of 10 characters required.", bundle: .module) - .foregroundStyle(Color.secondary) - .font(.system(.caption, design: .rounded)) - } - - Spacer() - - PrimaryButton( - String(localized: "Send", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.isDisabled - ) { - store.send(.sendButtonTapped) - } - } - .padding(.vertical, 24) - .padding(.horizontal, 16) - .formStyle(ColumnsFormStyle()) - .navigationTitle(Text("Report a TenMatch", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .bind(viewStore.$focus, to: $focus) - .alert(store: store.scope(state: \.$alert, action: \.alert)) - } - } -} - -#Preview { - NavigationStack { - ReportReasonView( - store: .init( - initialState: ReportReasonLogic.State( - title: String(localized: "Spam", bundle: .module), - kind: .user(targetUserId: "") - ), - reducer: { ReportReasonLogic() } - ) - ) - } - .presentationDragIndicator(.visible) - .presentationDetents([.medium, .large]) - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/SettingsFeature/CreationDate.swift b/Packages/TenMatch/Sources/SettingsFeature/CreationDate.swift deleted file mode 100644 index e77e9976..00000000 --- a/Packages/TenMatch/Sources/SettingsFeature/CreationDate.swift +++ /dev/null @@ -1,29 +0,0 @@ -import ComposableArchitecture -import SettingsLogic -import SwiftUI - -public struct CreationDateView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - Text(viewStore.creationDateString) - .task { await store.send(.onTask).finish() } - } - } -} - -#Preview { - CreationDateView( - store: .init( - initialState: CreationDateLogic.State( - creationDate: Date.now.addingTimeInterval(-20_000_000) - ), - reducer: { CreationDateLogic() } - ) - ) -} diff --git a/Packages/TenMatch/Sources/SettingsFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/SettingsFeature/Localizable.xcstrings deleted file mode 100644 index 3153b3c0..00000000 --- a/Packages/TenMatch/Sources/SettingsFeature/Localizable.xcstrings +++ /dev/null @@ -1,504 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "ABOUT" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "À PROPOS" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "基本情報" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "VỀ CHÚNG TÔI" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "정보" - } - } - } - }, - "Contact Us" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Contactez-nous" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お問い合わせ" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Liên hệ với chúng tôi" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "문의하기" - } - } - } - }, - "Delete Account" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Supprimer le compte" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "アカウントを削除する" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Xóa tài khoản" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계정 삭제" - } - } - } - }, - "Edit Profile" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Modifier le profil" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール編集" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chỉnh sửa hồ sơ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필 수정" - } - } - } - }, - "FAQ" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "FAQ" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "よくある質問" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Câu hỏi thường gặp" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "자주 묻는 질문" - } - } - } - }, - "Help" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Aide" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ヘルプ" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Trợ giúp" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "도움말" - } - } - } - }, - "How It Works" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comment ça marche" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatchの使い方" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cách hoạt động" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "작동 방식" - } - } - } - }, - "Membership Status" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Statut de membre" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "会員ステータス" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tình trạng hội viên" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "회원 상태" - } - } - } - }, - "My Profile" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Mon profil" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "自分のプロフィール" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hồ sơ của tôi" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "내 프로필" - } - } - } - }, - "Other" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Autre" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "その他" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Khác" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "기타" - } - } - } - }, - "Privacy Policy" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Politique de confidentialité" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プライバシーポリシー" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chính sách bảo mật" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "개인정보 처리방침" - } - } - } - }, - "PROFILE" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "PROFIL" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロフィール" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "HỒ SƠ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "프로필" - } - } - } - }, - "Push Notifications" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プッシュ通知" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Thông báo đẩy" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "푸시 알림" - } - } - } - }, - "Rate TenMatch." : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Évaluer TenMatch." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatchを評価" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Đánh giá TenMatch." - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch 평가하기" - } - } - } - }, - "Settings" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Paramètres" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "設定" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cài đặt" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "설정" - } - } - } - }, - "Share TenMatch" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Partager TenMatch" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatchをシェア" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chia sẻ TenMatch" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch 공유하기" - } - } - } - }, - "Terms of Use" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Conditions d'utilisation" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "利用規約" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Điều khoản sử dụng" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이용 약관" - } - } - } - }, - "Version" : { - "localizations" : { - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "バージョン" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Phiên bản" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "버전" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/SettingsFeature/Settings.swift b/Packages/TenMatch/Sources/SettingsFeature/Settings.swift deleted file mode 100644 index bdc67fd6..00000000 --- a/Packages/TenMatch/Sources/SettingsFeature/Settings.swift +++ /dev/null @@ -1,246 +0,0 @@ -import AchievementFeature -import ActivityView -import ComposableArchitecture -import MembershipStatusFeature -import ProfileEditFeature -import ProfileFeature -import PushNotificationSettingsFeature -import SettingsLogic -import SwiftUI -import TutorialFeature - -public struct SettingsView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - List { - Section { - Button { - store.send(.myProfileButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("My Profile", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.editProfileButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Edit Profile", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.membershipStatusButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Membership Status", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } header: { - Text("PROFILE", bundle: .module) - } - - Section { - Button { - store.send(.howItWorksButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("How It Works", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Link(destination: viewStore.faqURL) { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("FAQ", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Link(destination: viewStore.contactUsURL) { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Contact Us", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - } header: { - Text("Help", bundle: .module) - } - - Section { - Button { - store.send(.pushNotificationSettingsButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Push Notifications", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.otherButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Other", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } header: { - Text("Settings", bundle: .module) - } - - Section { - Link(destination: viewStore.termsOfUseURL) { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Terms of Use", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Link(destination: viewStore.privacyPolicyURL) { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Privacy Policy", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.shareButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Share TenMatch", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.rateButtonTapped) - } label: { - LabeledContent { - Image(systemName: "chevron.right") - } label: { - Text("Rate TenMatch", bundle: .module) - .foregroundStyle(Color.primary) - } - } - - Button { - store.send(.versionButtonTapped, animation: .default) - } label: { - LabeledContent { - Text(viewStore.bundleShortVersion) - } label: { - Text("Version", bundle: .module) - .foregroundStyle(Color.primary) - } - } - } header: { - Text("ABOUT", bundle: .module) - } footer: { - IfLetStore( - store.scope(state: \.creationDate, action: \.creationDate), - then: CreationDateView.init(store:) - ) - .padding(.bottom, 24) - .frame(maxWidth: .infinity, alignment: .center) - .multilineTextAlignment(.center) - } - } - .navigationTitle(String(localized: "Settings", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .sheet(isPresented: viewStore.$isSharePresented) { - ActivityView( - activityItems: [viewStore.shareText], - applicationActivities: nil - ) { activityType, result, _, _ in - store.send( - .onCompletion( - SettingsLogic.CompletionWithItems( - activityType: activityType, - result: result - ) - ) - ) - } - .presentationDetents([.medium, .large]) - } - .fullScreenCover( - store: store.scope(state: \.$destination.tutorial, action: \.destination.tutorial), - content: TutorialView.init(store:) - ) - .fullScreenCover( - store: store.scope(state: \.$destination.profile, action: \.destination.profile) - ) { store in - NavigationStack { - ProfileView(store: store) - } - } - .fullScreenCover( - store: store.scope(state: \.$destination.profileEdit, action: \.destination.profileEdit) - ) { store in - NavigationStack { - ProfileEditView(store: store) - } - } - .navigationDestination( - store: store.scope(state: \.$destination.membershipStatus, action: \.destination.membershipStatus), - destination: MembershipStatusView.init(store:) - ) - .navigationDestination( - store: store.scope(state: \.$destination.other, action: \.destination.other), - destination: SettingsOtherView.init(store:) - ) - .navigationDestination( - store: store.scope(state: \.$destination.pushNotificationSettings, action: \.destination.pushNotificationSettings), - destination: PushNotificationSettingsView.init(store:) - ) - } - } -} - -#Preview { - NavigationStack { - SettingsView( - store: .init( - initialState: SettingsLogic.State(), - reducer: { SettingsLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/SettingsFeature/SettingsOther.swift b/Packages/TenMatch/Sources/SettingsFeature/SettingsOther.swift deleted file mode 100644 index 3abef3aa..00000000 --- a/Packages/TenMatch/Sources/SettingsFeature/SettingsOther.swift +++ /dev/null @@ -1,52 +0,0 @@ -import ComposableArchitecture -import DeleteAccountFeature -import SettingsLogic -import SwiftUI - -public struct SettingsOtherView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { _ in - List { - Section { - Button(role: .destructive) { - store.send(.deleteAccountButtonTapped) - } label: { - Text("Delete Account", bundle: .module) - .frame(maxWidth: .infinity, alignment: .center) - } - } - } - .navigationTitle(String(localized: "Other", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .fullScreenCover( - store: store.scope( - state: \.$deleteAccount, - action: \.deleteAccount - ) - ) { store in - NavigationStack { - DeleteAccountView(store: store) - } - } - } - } -} - -#Preview { - NavigationStack { - SettingsOtherView( - store: .init( - initialState: SettingsOtherLogic.State(), - reducer: { SettingsOtherLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings deleted file mode 100644 index 0ff29a53..00000000 --- a/Packages/TenMatch/Sources/ShortCommentSettingFeature/Localizable.xcstrings +++ /dev/null @@ -1,126 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Comment" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ひとこと" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "댓글" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Commentaire" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Komentarz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bình luận" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comentario" - } - } - } - }, - "Do not write tenten or other social media username." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenや他のSNSのIDを書かないでください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "tenten 또는 다른 소셜 미디어 사용자 이름을 작성하지 마세요." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Ne pas écrire le nom d'utilisateur tenten ou d'autres réseaux sociaux." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nie wpisuj nazwy użytkownika tenten ani innych mediów społecznościowych." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Không viết tên người dùng tenten hoặc các mạng xã hội khác." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "No escriba el nombre de usuario de tenten u otras redes sociales." - } - } - } - }, - "Save" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保存する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "저장" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Enregistrer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zapisz" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Lưu" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Guardar" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift b/Packages/TenMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift deleted file mode 100644 index 3a7e4b46..00000000 --- a/Packages/TenMatch/Sources/ShortCommentSettingFeature/ShortCommentSetting.swift +++ /dev/null @@ -1,64 +0,0 @@ -import ComposableArchitecture -import ShortCommentSettingLogic -import Styleguide -import SwiftUI - -public struct ShortCommentSettingView: View { - @FocusState var focus: ShortCommentSettingLogic.State.Focus? - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 24) { - Text("Do not write tenten or other social media username.", bundle: .module) - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .foregroundStyle(Color.secondary) - - TextEditor(text: viewStore.$shortComment) - .frame(height: 100) - .lineLimit(1 ... 3) - .focused($focus, equals: .shortComment) - .padding() - .overlay( - RoundedRectangle(cornerRadius: 12) - .stroke(Color.primary, lineWidth: 1.0) - ) - - PrimaryButton( - String(localized: "Save", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible, - isDisabled: viewStore.isActivityIndicatorVisible - ) { - store.send(.saveButtonTapped) - } - .frame(maxHeight: .infinity, alignment: .bottom) - } - .padding(.top, 24) - .padding(.horizontal, 16) - .padding(.bottom, 16) - .navigationTitle(String(localized: "Comment", bundle: .module)) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .bind(viewStore.$focus, to: $focus) - .alert(store: store.scope(state: \.$alert, action: \.alert)) - } - } -} - -#Preview { - NavigationStack { - ShortCommentSettingView( - store: .init( - initialState: ShortCommentSettingLogic.State( - shortComment: nil - ), - reducer: { ShortCommentSettingLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/Styleguide/Buttons.swift b/Packages/TenMatch/Sources/Styleguide/Buttons.swift deleted file mode 100644 index 7aa6ef4c..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Buttons.swift +++ /dev/null @@ -1,23 +0,0 @@ -import SwiftUI - -public struct HoldDownButtonStyle: ButtonStyle { - public init() {} - public func makeBody(configuration: Configuration) -> some View { - configuration.label - .scaleEffect(configuration.isPressed ? 0.9 : 1.0) - .animation(.default, value: configuration.isPressed) - } -} - -#Preview { - Button(action: {}) { - Text("Continue") - .frame(height: 54) - .frame(maxWidth: .infinity) - .foregroundStyle(.white) - .background(Color.orange) - .clipShape(Capsule()) - } - .padding() - .buttonStyle(HoldDownButtonStyle()) -} diff --git a/Packages/TenMatch/Sources/Styleguide/ColorHex.swift b/Packages/TenMatch/Sources/Styleguide/ColorHex.swift deleted file mode 100644 index 31e92f49..00000000 --- a/Packages/TenMatch/Sources/Styleguide/ColorHex.swift +++ /dev/null @@ -1,13 +0,0 @@ -import SwiftUI - -public extension Color { - init(_ hex: UInt, opacity: Double = 1.0) { - self.init( - .sRGB, - red: Double((hex >> 16) & 0xFF) / 255, - green: Double((hex >> 8) & 0xFF) / 255, - blue: Double(hex & 0xFF) / 255, - opacity: opacity - ) - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.swift b/Packages/TenMatch/Sources/Styleguide/Colors.swift deleted file mode 100644 index e3b227b0..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.swift +++ /dev/null @@ -1,24 +0,0 @@ -import SwiftUI - -public extension Color { - static let godSeparator = Color(uiColor: UIColor.separator) - static let godGray = Color(ColorResource.gray) - static let godBlack = Color(ColorResource.black) - static let godService = Color(ColorResource.service) - static let godTextPrimary = Color(ColorResource.textPrimary) - static let godTextSecondaryDark = Color(ColorResource.textSecondaryDark) - static let godTextSecondaryLight = Color(ColorResource.textSecondaryLight) - static let godWhite = Color(ColorResource.white) - static let godBackgroundWhite = Color(ColorResource.backgroundWhite) - - static let godBlue = Color(ColorResource.blue) - static let godPink = Color(ColorResource.pink) - - static let godPurple = Color(ColorResource.purple) - static let godPurpleLight = Color(ColorResource.purpleLight) - - static let godGreen = Color(ColorResource.green) - static let godGreenLight = Color(ColorResource.greenLight) - - static let godYellow = Color(ColorResource.yellow) -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/background-white.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/background-white.colorset/Contents.json deleted file mode 100644 index 58965c08..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/background-white.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xF9", - "green" : "0xF9", - "red" : "0xF9" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/black.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/black.colorset/Contents.json deleted file mode 100644 index 2f8b75a1..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/black.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x1E", - "green" : "0x1E", - "red" : "0x1E" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/blue.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/blue.colorset/Contents.json deleted file mode 100644 index 89e51763..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/blue.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xDE", - "green" : "0x93", - "red" : "0x58" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/gray.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/gray.colorset/Contents.json deleted file mode 100644 index a467ddfa..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/gray.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x37", - "green" : "0x37", - "red" : "0x37" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green-light.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green-light.colorset/Contents.json deleted file mode 100644 index 8e0e75a3..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green-light.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x98", - "green" : "0xDE", - "red" : "0x94" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green.colorset/Contents.json deleted file mode 100644 index 2d62f3a8..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/green.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x51", - "green" : "0xC1", - "red" : "0x58" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/pink.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/pink.colorset/Contents.json deleted file mode 100644 index 0cd6aa15..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/pink.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x5E", - "green" : "0x34", - "red" : "0xE3" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple-light.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple-light.colorset/Contents.json deleted file mode 100644 index e7bb18ae..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple-light.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xF1", - "green" : "0x93", - "red" : "0xC3" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple.colorset/Contents.json deleted file mode 100644 index e943d570..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/purple.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xEA", - "green" : "0x35", - "red" : "0x94" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/service.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/service.colorset/Contents.json deleted file mode 100644 index 751215a5..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/service.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x18", - "green" : "0x51", - "red" : "0xFF" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-primary.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-primary.colorset/Contents.json deleted file mode 100644 index 7e8f38fe..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-primary.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x00", - "green" : "0x00", - "red" : "0x00" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-dark.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-dark.colorset/Contents.json deleted file mode 100644 index 1854dadd..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-dark.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x8F", - "green" : "0x8F", - "red" : "0x8F" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-light.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-light.colorset/Contents.json deleted file mode 100644 index e64e739a..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/text-secondary-light.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xAD", - "green" : "0xAC", - "red" : "0xAE" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/white.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/white.colorset/Contents.json deleted file mode 100644 index fafa4767..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/white.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0xFF", - "green" : "0xFF", - "red" : "0xFF" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/yellow.colorset/Contents.json b/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/yellow.colorset/Contents.json deleted file mode 100644 index 24084351..00000000 --- a/Packages/TenMatch/Sources/Styleguide/Colors.xcassets/yellow.colorset/Contents.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "colors" : [ - { - "color" : { - "color-space" : "srgb", - "components" : { - "alpha" : "1.000", - "blue" : "0x3D", - "green" : "0xB5", - "red" : "0xE9" - } - }, - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/PrimaryButton.swift b/Packages/TenMatch/Sources/Styleguide/PrimaryButton.swift deleted file mode 100644 index 4c4f8ebd..00000000 --- a/Packages/TenMatch/Sources/Styleguide/PrimaryButton.swift +++ /dev/null @@ -1,50 +0,0 @@ -import SwiftUI - -public struct PrimaryButton: View { - let title: String - let isLoading: Bool - let isDisabled: Bool - let action: () -> Void - - public init( - _ title: String, - isLoading: Bool = false, - isDisabled: Bool = false, - action: @escaping () -> Void - ) { - self.title = title - self.isLoading = isLoading - self.isDisabled = isDisabled - self.action = action - } - - public var body: some View { - Button(action: action) { - Group { - if isLoading { - ProgressView() - .progressViewStyle(.circular) - .tint(Color.black) - } else { - Text(title) - } - } - .font(.system(.subheadline, design: .rounded, weight: .semibold)) - .frame(height: 50) - .frame(maxWidth: .infinity) - .foregroundStyle( - isLoading || isDisabled - ? Color(uiColor: UIColor.quaternaryLabel) - : Color.black - ) - .background( - isLoading || isDisabled - ? Color(uiColor: UIColor.secondarySystemBackground) - : Color.white - ) - .cornerRadius(16) - } - .disabled(isLoading || isDisabled) - .buttonStyle(HoldDownButtonStyle()) - } -} diff --git a/Packages/TenMatch/Sources/Styleguide/RoundedCorner.swift b/Packages/TenMatch/Sources/Styleguide/RoundedCorner.swift deleted file mode 100644 index 768b3b4b..00000000 --- a/Packages/TenMatch/Sources/Styleguide/RoundedCorner.swift +++ /dev/null @@ -1,17 +0,0 @@ -import SwiftUI - -public extension View { - func cornerRadius(_ radius: CGFloat, corners: UIRectCorner) -> some View { - clipShape(RoundedCorner(radius: radius, corners: corners)) - } -} - -public struct RoundedCorner: Shape { - var radius: CGFloat = .infinity - var corners: UIRectCorner = .allCorners - - public func path(in rect: CGRect) -> Path { - let path = UIBezierPath(roundedRect: rect, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)) - return Path(path.cgPath) - } -} diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/Contents.json b/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/Contents.json deleted file mode 100644 index 3ae79fd4..00000000 --- a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "like.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf b/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf deleted file mode 100644 index aceda3ee..00000000 Binary files a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/like.imageset/like.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/Contents.json b/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/Contents.json deleted file mode 100644 index 4769406d..00000000 --- a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "nope.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf b/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf deleted file mode 100644 index 0db5a112..00000000 Binary files a/Packages/TenMatch/Sources/SwipeCardFeature/Assets.xcassets/nope.imageset/nope.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/SwipeCardFeature/Localizable.xcstrings deleted file mode 100644 index a92241aa..00000000 --- a/Packages/TenMatch/Sources/SwipeCardFeature/Localizable.xcstrings +++ /dev/null @@ -1,86 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Block" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ブロックする" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "차단" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Blokuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Chặn" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bloquear" - } - } - } - }, - "Report" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "通報する" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "신고" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Signaler" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zgłoś" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Báo cáo" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Reportar" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/SwipeCardFeature/SwipeCard.swift b/Packages/TenMatch/Sources/SwipeCardFeature/SwipeCard.swift deleted file mode 100644 index d5a88388..00000000 --- a/Packages/TenMatch/Sources/SwipeCardFeature/SwipeCard.swift +++ /dev/null @@ -1,213 +0,0 @@ -import API -import CachedAsyncImage -import ComposableArchitecture -import SelectControl -import SwiftUI -import SwipeCardLogic - -public struct SwipeCardView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - @State var translation: CGSize = .zero - let width = UIScreen.main.bounds.width - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - ForEach(viewStore.data.images, id: \.id) { image in - if image == viewStore.selection { - CachedAsyncImage( - url: URL(string: image.imageUrl), - urlCache: .shared, - scale: displayScale, - content: { content in - content - .resizable() - .aspectRatio(contentMode: .fill) - .frame(width: width, height: width * (4 / 3)) - }, - placeholder: { - ProgressView() - .progressViewStyle(CircularProgressViewStyle()) - .tint(Color.white) - .frame(width: width, height: width * (4 / 3)) - .background() - } - ) - .cornerRadius(16) - .overlay(alignment: .top) { - SelectControl( - current: viewStore.selection, - items: viewStore.data.images - ) - .padding(.top, 8) - .padding(.horizontal, 40) - } - .overlay(alignment: .topLeading) { - Image(ImageResource.like) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 310) - .offset(x: -50, y: -110) - .opacity(translation.width) - } - .overlay(alignment: .topTrailing) { - Image(ImageResource.nope) - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 260) - .offset(x: 0, y: -110) - .opacity(-translation.width) - } - } - } - .overlay(alignment: .topTrailing) { - Menu { - Button { - store.send(.reportButtonTapped) - } label: { - Text("Report", bundle: .module) - } - - Button { - store.send(.swipeToNope) - } label: { - Text("Block", bundle: .module) - } - } label: { - Image(systemName: "ellipsis") - .bold() - .foregroundStyle(Color.white) - .frame(width: 44, height: 44) - .padding(.all, 4) - } - } - .overlay(alignment: .bottom) { - if let shortComment = viewStore.data.shortComment?.body { - Text(shortComment) - .padding(.vertical, 12) - .padding(.horizontal, 24) - .background(Material.ultraThin) - .clipShape(Capsule()) - .padding(.bottom, 16) - .padding(.horizontal, 32) - .multilineTextAlignment(.center) - .font(.system(.footnote, design: .rounded, weight: .semibold)) - } - } - .offset(translation) - .rotationEffect(.degrees(Double(translation.width / 300) * 25), anchor: .bottom) - .gesture( - DragGesture() - .onChanged { translation = $0.translation } - .onEnded { _ in - let targetHorizontalTranslation = UIScreen.main.bounds.width / 2 + UIScreen.main.bounds.width / 2 - withAnimation { - switch translation.width { - case let width where width > 100: - translation = CGSize(width: targetHorizontalTranslation, height: translation.height) - store.send(.swipeToLike) - case let width where width < -100: - translation = CGSize(width: -targetHorizontalTranslation, height: translation.height) - store.send(.swipeToNope) - default: - translation = CGSize.zero - } - } - } - ) - .gesture( - DragGesture(minimumDistance: 0) - .onEnded { value in - if value.translation.equalTo(.zero) { - if value.location.x <= UIScreen.main.bounds.width / 2 { - store.send(.backButtonTapped) - } else { - store.send(.forwardButtonTapped) - } - } - } - ) - } - } -} - -#Preview { - SwipeCardView( - store: .init( - initialState: SwipeCardLogic.State( - data: API.SwipeCard( - _dataDict: DataDict( - data: [ - "id": "1", - "shortComment": DataDict( - data: [ - "id": "1", - "body": "生まれたからには世界中の人と仲良くなりたいです。近くに住んでいる人いたら教えてください。", - ], - fulfilledFragments: [] - ), - "images": [ - DataDict( - data: [ - "id": "1", - "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/4ACA05F5-6FA7-4E26-8595-15E0EF00A544.jpeg?size=408x408", - ], - fulfilledFragments: [] - ), - DataDict( - data: [ - "id": "2", - "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/675DD4EA-D968-4E0E-AC6C-37498A44061C.jpeg?size=408x408", - ], - fulfilledFragments: [] - ), - ], - ], - fulfilledFragments: [] - ) - ) - ), - reducer: SwipeCardLogic.init - ) - ) - .environment(\.colorScheme, .dark) -} - -#Preview { - SwipeCardView( - store: .init( - initialState: SwipeCardLogic.State( - data: API.SwipeCard( - _dataDict: DataDict( - data: [ - "id": "1", - "images": [ - DataDict( - data: [ - "id": "1", - "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/4ACA05F5-6FA7-4E26-8595-15E0EF00A544.jpeg?size=408x408", - ], - fulfilledFragments: [] - ), - DataDict( - data: [ - "id": "2", - "imageUrl": "https://bematch-staging.firebaseapp.com/users/profile_images/Yd3XEZmHGxhCCWBMY117JjklFoy1/675DD4EA-D968-4E0E-AC6C-37498A44061C.jpeg?size=408x408", - ], - fulfilledFragments: [] - ), - ], - ], - fulfilledFragments: [] - ) - ) - ), - reducer: SwipeCardLogic.init - ) - ) - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/Contents.json b/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/Contents.json deleted file mode 100644 index 36798f70..00000000 --- a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "heart.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf b/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf deleted file mode 100644 index 5ba6572c..00000000 Binary files a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/heart.imageset/heart.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/Contents.json b/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/Contents.json deleted file mode 100644 index 41b779d8..00000000 --- a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "xmark.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf b/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf deleted file mode 100644 index 67d4eb18..00000000 Binary files a/Packages/TenMatch/Sources/SwipeFeature/Assets.xcassets/xmark.imageset/xmark.pdf and /dev/null differ diff --git a/Packages/TenMatch/Sources/SwipeFeature/Swipe.swift b/Packages/TenMatch/Sources/SwipeFeature/Swipe.swift deleted file mode 100644 index 4b870cc7..00000000 --- a/Packages/TenMatch/Sources/SwipeFeature/Swipe.swift +++ /dev/null @@ -1,95 +0,0 @@ -import CachedAsyncImage -import ComposableArchitecture -import MatchedFeature -import ReportFeature -import Styleguide -import SwiftUI -import SwipeCardFeature -import SwipeLogic - -public struct SwipeView: View { - @Environment(\.displayScale) var displayScale - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 32) { - Spacer() - - ZStack { - ForEachStore( - store.scope(state: \.rows, action: \.rows), - content: SwipeCardView.init(store:) - ) - } - - HStack(spacing: 40) { - Button { - store.send(.nopeButtonTapped) - } label: { - Image(ImageResource.xmark) - .resizable() - .frame(width: 56, height: 56) - .clipShape(Circle()) - } - - Button { - store.send(.likeButtonTapped) - } label: { - Image(ImageResource.heart) - .resizable() - .frame(width: 56, height: 56) - .clipShape(Circle()) - } - } - .buttonStyle(HoldDownButtonStyle()) - - Spacer() - } - .frame(maxWidth: .infinity) - .background { - CachedAsyncImage( - url: viewStore.backgroundCoverImageUrl, - urlCache: URLCache.shared, - scale: displayScale, - content: { content in - content - .resizable() - .aspectRatio(contentMode: .fill) - }, - placeholder: { - Color.black - } - ) - .blur(radius: 40) - .overlay(Color.black.opacity(0.8)) - } - .ignoresSafeArea() - .fullScreenCover( - store: store.scope(state: \.$destination.matched, action: \.destination.matched), - content: MatchedView.init(store:) - ) - .sheet(store: store.scope(state: \.$destination.report, action: \.destination.report)) { store in - NavigationStack { - ReportView(store: store) - } - } - } - } -} - -#Preview { - NavigationStack { - SwipeView( - store: .init( - initialState: SwipeLogic.State(rows: []), - reducer: SwipeLogic.init - ) - ) - } - .environment(\.colorScheme, .dark) -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/Contents.json b/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/Contents.json deleted file mode 100644 index 64100bce..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "waving-hand.svg", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/waving-hand.svg b/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/waving-hand.svg deleted file mode 100644 index 22723d5a..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Assets.xcassets/waving-hand.imageset/waving-hand.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Packages/TenMatch/Sources/TutorialFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/TutorialFeature/Localizable.xcstrings deleted file mode 100644 index 1646f8dd..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Localizable.xcstrings +++ /dev/null @@ -1,366 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "Continue" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - } - } - }, - "Get started" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "さっそくはじめる" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "시작하기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Commencer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zacznij" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bắt đầu" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Empezar" - } - } - } - }, - "Hmmm... left when" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "うーん...のときは左" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "흠... 언제 떠났나요?" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hmmm... gauche quand" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hmmm... lewo, kiedy" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hmmm... bên trái khi" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hmmm... izquierda cuando" - } - } - } - }, - "If you both Like each other, a match is made. Let's give it a try right away!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "お互いにLikeするとマッチが成立。早速試してみよう!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "두 사람이 서로 마음에 들면 매칭이 성사됩니다. 지금 바로 시도해 보세요!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous vous aimez tous les deux, une correspondance est faite. Essayons tout de suite!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jeśli oboje się lubicie, następuje dopasowanie. Wypróbujmy od razu!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nếu cả hai bạn thích nhau, một cặp đôi được tạo ra. Hãy thử ngay thôi nào!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si ambos se gustan, se forma una coincidencia. ¡Vamos a intentarlo de inmediato!" - } - } - } - }, - "If you think, \"Maybe not...\", swipe left. If you think it's not quite right, swipe left." : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "ちょっと違うかも...と思ったら、左にスワイプしよう。Nopeしたことは相手に伝わらないから大丈夫。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "“아닐 수도 있는데...”라고 생각되면 왼쪽으로 스와이프합니다.적절하지 않다고 생각되면 왼쪽으로 스와이프합니다." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous pensez, « Peut-être pas... », balayez vers la gauche. Si vous pensez que ce n'est pas tout à fait ça, balayez vers la gauche." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Jeśli myślisz: „Może nie...”, przesuń palcem w lewo. Jeśli uważasz, że to nie do końca to, przesuń palcem w lewo." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Nếu bạn nghĩ, \"Có lẽ không...\", hãy vuốt sang trái. Nếu bạn nghĩ rằng không đúng lắm, hãy vuốt sang trái." - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si piensas: \"Quizás no...\", desliza hacia la izquierda. Si crees que no es del todo correcto, desliza hacia la izquierda." - } - } - } - }, - "Let's get started!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "さっそくはじめよう!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "시작해보자!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Commençons!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Zacznijmy!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hãy bắt đầu nào!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Vamos a empezar!" - } - } - } - }, - "Right if you are interested!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "気になる人は右!" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "관심이 있으시다면 바로 그거예요!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "À droite si vous êtes intéressé!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "W prawo, jeśli jesteś zainteresowany!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vuốt sang phải nếu bạn quan tâm!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡Derecha si estás interesado!" - } - } - } - }, - "Skip" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スキップ" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "건너뛰기" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passer" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Pomiń" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bỏ qua" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Saltar" - } - } - } - }, - "TenMatch is an application that allows you to exchange tenten with everyone in Global!" : { - "localizations" : { - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatchは日本中のみんなとtentenを交換できるアプリです" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "트링켓은 한국의 모든 사람들과 로켓을 교환할 수 있는 애플리케이션입니다!" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch est une application qui vous permet d'échanger tenten avec tout le monde dans le monde!" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch to aplikacja umożliwiająca wymianę tenten z wszystkimi na całym świecie!" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "TenMatch là một ứng dụng cho phép bạn trao đổi tenten với mọi người trên toàn cầu!" - } - }, - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "¡TenMatch es una aplicación que te permite intercambiar tenten con todos en el mundo!" - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Step1.swift b/Packages/TenMatch/Sources/TutorialFeature/Step1.swift deleted file mode 100644 index a87a06d1..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Step1.swift +++ /dev/null @@ -1,21 +0,0 @@ -import SwiftUI - -struct Step1View: View { - var body: some View { - VStack(spacing: 40) { - Image(ImageResource.wavingHand) - .resizable() - .frame(width: 40, height: 40) - - VStack(spacing: 16) { - Text("Let's get started!", bundle: .module) - .font(.system(.title, design: .rounded, weight: .bold)) - - Text("TenMatch is an application that allows you to exchange tenten with everyone in Global!", bundle: .module) - .font(.system(.headline, design: .rounded)) - } - .padding(.horizontal, 56) - } - .foregroundStyle(Color.white) - } -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Step2.swift b/Packages/TenMatch/Sources/TutorialFeature/Step2.swift deleted file mode 100644 index efa0bcf2..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Step2.swift +++ /dev/null @@ -1,15 +0,0 @@ -import SwiftUI - -struct Step2View: View { - var body: some View { - VStack(spacing: 24) { - Text("Right if you are interested!", bundle: .module) - .font(.system(.title, design: .rounded, weight: .bold)) - - Text("If you both Like each other, a match is made. Let's give it a try right away!", bundle: .module) - .font(.system(.headline, design: .rounded)) - } - .padding(.horizontal, 56) - .foregroundStyle(Color.white) - } -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Step3.swift b/Packages/TenMatch/Sources/TutorialFeature/Step3.swift deleted file mode 100644 index a2effc86..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Step3.swift +++ /dev/null @@ -1,15 +0,0 @@ -import SwiftUI - -struct Step3View: View { - var body: some View { - VStack(spacing: 24) { - Text("Hmmm... left when", bundle: .module) - .font(.system(.title, design: .rounded, weight: .bold)) - - Text(#"If you think, "Maybe not...", swipe left. If you think it's not quite right, swipe left."#, bundle: .module) - .font(.system(.headline, design: .rounded)) - } - .padding(.horizontal, 56) - .foregroundStyle(Color.white) - } -} diff --git a/Packages/TenMatch/Sources/TutorialFeature/Tutorial.swift b/Packages/TenMatch/Sources/TutorialFeature/Tutorial.swift deleted file mode 100644 index bfac22d6..00000000 --- a/Packages/TenMatch/Sources/TutorialFeature/Tutorial.swift +++ /dev/null @@ -1,107 +0,0 @@ -import ComposableArchitecture -import Styleguide -import SwiftUI -import TutorialLogic - -public struct TutorialView: View { - let store: StoreOf - - public init(store: StoreOf) { - self.store = store - } - - struct ViewState: Equatable { - let currentStep: TutorialLogic.Step - let isSkipButtonHidden: Bool - let isOnTapGestureDisabled: Bool - let isNextButtonHidden: Bool - let isFinishButtonHidden: Bool - - init(state: TutorialLogic.State) { - currentStep = state.currentStep - isSkipButtonHidden = [TutorialLogic.Step.first, .third].contains(state.currentStep) - isOnTapGestureDisabled = state.currentStep == .third - isNextButtonHidden = state.currentStep != .first - isFinishButtonHidden = state.currentStep != .third - } - } - - public var body: some View { - WithViewStore(store, observe: ViewState.init) { viewStore in - VStack(spacing: 53) { - Spacer() - - switch viewStore.currentStep { - case .first: - Step1View() - case .second: - Step2View() - case .third: - Step3View() - } - - if !viewStore.isNextButtonHidden { - VStack(spacing: 24) { - PrimaryButton( - String(localized: "Continue", bundle: .module) - ) { - store.send(.nextButtonTapped, animation: .default) - } - - Button { - store.send(.skipButtonTapped) - } label: { - Text("Skip", bundle: .module) - .foregroundStyle(Color.godTextSecondaryDark) - .font(.system(.body, design: .rounded, weight: .bold)) - } - } - .padding(.horizontal, 60) - } - - Spacer() - } - .frame(maxWidth: .infinity, maxHeight: .infinity) - .multilineTextAlignment(.center) - .background(Color.black.opacity(0.9)) - .task { await store.send(.onTask).finish() } - .onTapGesture { - if !viewStore.isOnTapGestureDisabled { - store.send(.nextButtonTapped, animation: .default) - } - } - .overlay(alignment: .topTrailing) { - if !viewStore.isSkipButtonHidden { - Button { - store.send(.skipButtonTapped) - } label: { - Text("Skip", bundle: .module) - .foregroundStyle(Color.godTextSecondaryDark) - .font(.system(.body, design: .rounded, weight: .bold)) - .padding(.all, 24) - } - } - } - .overlay(alignment: .bottom) { - if !viewStore.isFinishButtonHidden { - PrimaryButton( - String(localized: "Get started", bundle: .module) - ) { - store.send(.finishButtonTapped) - } - .padding(.horizontal, 24) - } - } - } - } -} - -#Preview { - TutorialView( - store: .init( - initialState: TutorialLogic.State(), - reducer: { TutorialLogic() } - ) - ) - .environment(\.locale, Locale(identifier: "ja-JP")) -} diff --git a/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/Contents.json b/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/Contents.json deleted file mode 100644 index 73c00596..00000000 --- a/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json b/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json deleted file mode 100644 index 18ff4868..00000000 --- a/Packages/TenMatch/Sources/UsernameSettingFeature/Assets.xcassets/logo.imageset/Contents.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "images" : [ - { - "filename" : "TenMatch.pdf", - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Packages/TenMatch/Sources/UsernameSettingFeature/Localizable.xcstrings b/Packages/TenMatch/Sources/UsernameSettingFeature/Localizable.xcstrings deleted file mode 100644 index 81404505..00000000 --- a/Packages/TenMatch/Sources/UsernameSettingFeature/Localizable.xcstrings +++ /dev/null @@ -1,169 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "" : { - - }, - "By doing this, you agree\nto our [Privacy Policy](https://docs.tenmatch.app/privacy-policy) and [Terms of Use](https://docs.tenmatch.app/terms-of-use)." : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Al hacer esto, aceptas\nnuestra [Política de Privacidad](https://docs.tenmatch.app/privacy-policy) y [Términos de Uso](https://docs.tenmatch.app/terms-of-use)." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En faisant cela, vous acceptez\nnotre [Politique de confidentialité](https://docs.tenmatch.app/privacy-policy) et nos [Conditions d'utilisation](https://docs.tenmatch.app/terms-of-use)." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続けることで[プライバシーポリシー](https://docs.tenmatch.app/privacy-policy)および[利用規約](https://docs.tenmatch.app/terms-of-use)に同意するものとします。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "이렇게 하면 [개인정보 처리방침](https://docs.tenmatch.app/privacy-policy) 및 [이용약관](https://docs.tenmatch.app/terms-of-use)에 동의하는 것으로 간주됩니다." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Postępując w ten sposób, zgadzasz się\nna naszą [Politykę Prywatności](https://docs.tenmatch.app/privacy-policy) oraz [Warunki Użytkowania](https://docs.tenmatch.app/terms-of-use)." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Bằng cách này, bạn đồng ý với\n[Chính sách quyền riêng tư](https://docs.tenmatch.app/privacy-policy) và [Điều khoản sử dụng](https://docs.tenmatch.app/terms-of-use) của chúng tôi." - } - } - } - }, - "Continue" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuar" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Continuer" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "続ける" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "계속" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Kontynuuj" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tiếp tục" - } - } - } - }, - "ex. du9v5pq" : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "p. ej. du9v5pq" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "ex. du9v5pq" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "例: du9v5pq" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "예: du9v5pq" - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "np. du9v5pq" - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "ví dụ: du9v5pq" - } - } - } - }, - "Please tell me your\ntenten PIN." : { - "localizations" : { - "es" : { - "stringUnit" : { - "state" : "translated", - "value" : "Por favor, dime tu\nPIN de tenten." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "S'il vous plaît dites-moi votre\nPIN de tenten." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "tentenのPINを教えてください。" - } - }, - "ko" : { - "stringUnit" : { - "state" : "translated", - "value" : "tenten PIN을 알려주세요." - } - }, - "pl" : { - "stringUnit" : { - "state" : "translated", - "value" : "Proszę powiedz mi swój\nPIN tenten." - } - }, - "vi" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vui lòng cho tôi biết PIN của bạn\ntrên tenten." - } - } - } - } - }, - "version" : "1.0" -} diff --git a/Packages/TenMatch/Sources/UsernameSettingFeature/UsernameSetting.swift b/Packages/TenMatch/Sources/UsernameSettingFeature/UsernameSetting.swift deleted file mode 100644 index c888319c..00000000 --- a/Packages/TenMatch/Sources/UsernameSettingFeature/UsernameSetting.swift +++ /dev/null @@ -1,84 +0,0 @@ -import ComposableArchitecture -import Styleguide -import SwiftUI -import UsernameSettingLogic - -public struct UsernameSettingView: View { - @FocusState var isFocused: Bool - let store: StoreOf - - public init( - store: StoreOf - ) { - self.store = store - } - - public var body: some View { - WithViewStore(store, observe: { $0 }) { viewStore in - VStack(spacing: 16) { - Text("Please tell me your\ntenten PIN.", bundle: .module) - .font(.system(.title2, weight: .bold)) - - Text("ex. du9v5pq", bundle: .module) - .font(.system(.caption, design: .rounded)) - .tint(Color.gray) - .foregroundStyle(Color.gray) - - TextField("", text: viewStore.$value) - .foregroundStyle(Color.white) - .textInputAutocapitalization(.never) - .autocorrectionDisabled() - .frame(height: 56) - .focused($isFocused) - .background(Color(uiColor: UIColor.systemFill)) - .font(.system(.title3, design: .rounded, weight: .semibold)) - .clipShape(RoundedRectangle(cornerRadius: 12)) - - Spacer() - - Text("By doing this, you agree\nto our [Privacy Policy](https://docs.tenmatch.app/privacy-policy) and [Terms of Use](https://docs.tenmatch.app/terms-of-use).", bundle: .module) - .font(.system(.caption, design: .rounded)) - .foregroundStyle(Color.gray) - - PrimaryButton( - String(localized: "Continue", bundle: .module), - isLoading: viewStore.isActivityIndicatorVisible - ) { - store.send(.nextButtonTapped) - } - } - .padding(.top, 32) - .padding(.bottom, 16) - .padding(.horizontal, 16) - .multilineTextAlignment(.center) - .navigationBarTitleDisplayMode(.inline) - .task { await store.send(.onTask).finish() } - .onAppear { - isFocused = true - } - .toolbar { - ToolbarItem(placement: .principal) { - Image(ImageResource.logo) - } - } - .alert( - store: store.scope(state: \.$destination.alert, action: \.destination.alert) - ) - } - } -} - -#Preview { - NavigationStack { - UsernameSettingView( - store: .init( - initialState: UsernameSettingLogic.State( - username: "" - ), - reducer: { UsernameSettingLogic() } - ) - ) - } - .environment(\.colorScheme, .dark) - .environment(\.locale, Locale(identifier: "ja-JP")) -}