From 6bfde55b8f7d600d793508e45eb526aab0e0c45d Mon Sep 17 00:00:00 2001 From: Tsubasa SEKIGUCHI Date: Mon, 13 Jul 2026 09:31:34 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E5=88=9D=E6=9C=9F=E7=94=BB=E9=9D=A2?= =?UTF-8?q?=E3=81=AEPull=20to=20Refresh=E3=81=AE=E5=AF=BE=E8=B1=A1?= =?UTF-8?q?=E3=82=92=E3=83=97=E3=83=AA=E3=82=BB=E3=83=83=E3=83=88=E3=82=AB?= =?UTF-8?q?=E3=83=BC=E3=83=89=E3=82=88=E3=82=8A=E4=B8=8B=E3=81=AE=E8=B7=AF?= =?UTF-8?q?=E7=B7=9A=E3=83=AA=E3=82=B9=E3=83=88=E3=81=AE=E3=81=BF=E3=81=AB?= =?UTF-8?q?=E9=99=90=E5=AE=9A=20(#6412)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/screens/SelectLineScreen.render.test.tsx | 10 ++-- src/screens/SelectLineScreen.tsx | 60 ++++++++++++-------- 2 files changed, 41 insertions(+), 29 deletions(-) diff --git a/src/screens/SelectLineScreen.render.test.tsx b/src/screens/SelectLineScreen.render.test.tsx index c8c2b2038..c749030a2 100644 --- a/src/screens/SelectLineScreen.render.test.tsx +++ b/src/screens/SelectLineScreen.render.test.tsx @@ -282,16 +282,18 @@ describe('SelectLineScreen', () => { }); describe('ローディング状態', () => { - it('nearbyStationLoading=true のときスケルトンが表示される', () => { + it('nearbyStationLoading=true のとき路線リストのスケルトンが表示される', () => { setupDefaults({ nearbyStationLoading: true }); - const { getByTestId, queryByTestId } = render(); + const { getByTestId } = render(); expect(getByTestId('skeleton-placeholder')).toBeTruthy(); - expect(queryByTestId('presets')).toBeNull(); + // プリセットカードは上部固定表示になり最寄り駅のローディングとは独立したため、 + // ローディング中でも常に表示される + expect(getByTestId('presets')).toBeTruthy(); }); - it('nearbyStationLoading=false のときプリセットが表示される', () => { + it('nearbyStationLoading=false のとき路線リストのスケルトンは表示されない', () => { setupDefaults({ nearbyStationLoading: false }); const { getByTestId, queryByTestId } = render(); diff --git a/src/screens/SelectLineScreen.tsx b/src/screens/SelectLineScreen.tsx index d6cdebe11..ca79cfa37 100644 --- a/src/screens/SelectLineScreen.tsx +++ b/src/screens/SelectLineScreen.tsx @@ -45,10 +45,7 @@ import { SelectLineScreenPresets } from './SelectLineScreenPresets'; const styles = StyleSheet.create({ root: { paddingHorizontal: 24, flex: 1 }, - listContainerStyle: { - paddingBottom: 24, - paddingHorizontal: 24, - }, + listScroll: { flex: 1 }, heading: { fontSize: 24, fontWeight: 'bold', @@ -69,6 +66,10 @@ const styles = StyleSheet.create({ // https://github.com/facebook/react-native/issues/53987 const REFRESH_TINT_DELAY_MS = 500; +// 路線リストのスクロール領域下端の基本パディング。実際の下端余白はこれに +// フッタータブバーの高さ(useFooterHeight)を加算して算出する +const LIST_CONTENT_PADDING_BOTTOM = 24; + const NearbyStationLoader = () => ( @@ -152,12 +153,10 @@ const SelectLineScreen = () => { // --- 派生値 --- const footerHeight = useFooterHeight(); - const listPaddingBottom = useMemo(() => { - const flattened = StyleSheet.flatten(styles.listContainerStyle) as { - paddingBottom?: number; - }; - return (flattened?.paddingBottom ?? 24) + footerHeight; - }, [footerHeight]); + const listPaddingBottom = useMemo( + () => LIST_CONTENT_PADDING_BOTTOM + footerHeight, + [footerHeight] + ); const orientation = useDeviceOrientation(); const isPortraitOrientation = useMemo( @@ -303,36 +302,47 @@ const SelectLineScreen = () => { // --- JSX --- return ( <> - + {/* + 上下のセーフエリアは絶対配置オーバーレイの NowHeader / FooterTabBar が + それぞれ処理するため上下インセットは無効化する。一方、横向き/タブレットの + ノッチでコンテンツが欠けないよう、左右インセットだけは SafeAreaView で確保する。 + */} + + {/* + プリセットカードは上部に固定表示し、Pull to Refresh の対象外にする。 + paddingTop で固定ヘッダー(NowHeader)の直下に配置する。 + */} + + + + + + + {/* プリセットカードより下の路線リストのみ Pull to Refresh の対象にする */} } - contentContainerStyle={[ - styles.listContainerStyle, - nowHeaderHeight ? { paddingTop: nowHeaderHeight } : null, - { paddingBottom: listPaddingBottom }, - ]} + contentContainerStyle={{ paddingBottom: listPaddingBottom }} > {nearbyStationLoading && !refreshing ? ( ) : ( <> - - - {stationLines.length > 0 && ( From 392ba145fcea14a420cc9a4bd55f981ebccb49ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Jul 2026 09:43:49 +0900 Subject: [PATCH 2/2] Bump version for canary release (#6415) Co-authored-by: TinyKitten <32848922+TinyKitten@users.noreply.github.com> --- android/app/build.gradle | 4 +-- app.config.ts | 4 +-- ios/TrainLCD.xcodeproj/project.pbxproj | 36 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/android/app/build.gradle b/android/app/build.gradle index b5b350855..9f2340532 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -143,12 +143,12 @@ android { dimension "environment" applicationId "me.tinykitten.trainlcd.dev" versionNameSuffix "-dev" - versionCode 100000532 + versionCode 100000533 versionName "10.9.1" } prod { dimension "environment" - versionCode 100000532 + versionCode 100000533 versionName "10.9.1" } } diff --git a/app.config.ts b/app.config.ts index b0afef226..ad558ecbb 100644 --- a/app.config.ts +++ b/app.config.ts @@ -52,7 +52,7 @@ export default { }, }, ios: { - buildNumber: '2745', + buildNumber: '2746', scheme: IS_DEV ? 'CanaryTrainLCD' : 'ProdTrainLCD', bundleIdentifier: IS_DEV ? 'me.tinykitten.trainlcd.dev' : 'me.tinykitten.trainlcd', supportsTablet: true, @@ -60,7 +60,7 @@ export default { android: { package: IS_DEV ? 'me.tinykitten.trainlcd.dev' : 'me.tinykitten.trainlcd', permissions: [], - versionCode: 100000532, + versionCode: 100000533, }, owner: 'trainlcd', experiments: { diff --git a/ios/TrainLCD.xcodeproj/project.pbxproj b/ios/TrainLCD.xcodeproj/project.pbxproj index 8ca5a2965..224cd33ab 100644 --- a/ios/TrainLCD.xcodeproj/project.pbxproj +++ b/ios/TrainLCD.xcodeproj/project.pbxproj @@ -2407,7 +2407,7 @@ CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist; @@ -2446,7 +2446,7 @@ CODE_SIGN_ENTITLEMENTS = ProdTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Prod/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = TrainLCD; @@ -2505,7 +2505,7 @@ CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -2611,7 +2611,7 @@ CODE_SIGN_ENTITLEMENTS = TrainLCD/trainlcd.entitlements; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; CXX = "$(REACT_NATIVE_PATH)/scripts/xcode/ccache-clang++.sh"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -2690,7 +2690,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEAD_CODE_STRIPPING = YES; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist; @@ -2729,7 +2729,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryTrainLCD.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; INFOPLIST_FILE = TrainLCD/Schemes/Dev/Info.plist; @@ -2940,7 +2940,7 @@ CODE_SIGN_ENTITLEMENTS = RideSessionActivity/CanaryRideSessionActivity.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -2991,7 +2991,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3042,7 +3042,7 @@ CODE_SIGN_ENTITLEMENTS = WatchWidget/ProdWatchWidget.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3100,7 +3100,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3151,7 +3151,7 @@ CODE_SIGN_ENTITLEMENTS = WatchWidget/CanaryWatchWidget.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3208,7 +3208,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = YES; @@ -3256,7 +3256,7 @@ CODE_SIGN_ENTITLEMENTS = RideSessionActivity/ProdRideSessionActivity.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3307,7 +3307,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -3526,7 +3526,7 @@ CODE_SIGN_ENTITLEMENTS = ProdAppClip/ProdAppClip.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3582,7 +3582,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3632,7 +3632,7 @@ CODE_SIGN_ENTITLEMENTS = CanaryAppClip/CanaryAppClip.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO; @@ -3690,7 +3690,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 2745; + CURRENT_PROJECT_VERSION = 2746; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = E6R2G33Z36; ENABLE_USER_SCRIPT_SANDBOXING = NO;