Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
2ffe7f7
chore: consolidate release workflows, sync app.json version
claude Apr 16, 2026
3f83bc1
ci: trigger build on branch push to create v1.3.6 release
claude Apr 16, 2026
cfde38c
chore: bump version to 2.2.0 (versionCode 8)
claude Apr 16, 2026
fecd21a
feat: airport-specific airline filtering
claude Apr 16, 2026
ec2a823
feat: replace filter toggle with per-airline checklist
claude Apr 16, 2026
67ae108
feat: accumulate flights throughout the day — persist until midnight
claude Apr 16, 2026
975ed69
fix: staffMonitor dynamic column detection
claude Apr 16, 2026
20dde99
chore: bump version to 2.3.0 (versionCode 9)
claude Apr 16, 2026
86f5f1f
feat: always show stand/check-in/gate slots with placeholder
claude Apr 16, 2026
8aac618
ci: use stable keystore from secret instead of generating new one
claude Apr 16, 2026
24770bd
fix: remove light-mode card border artifacts
claude Apr 16, 2026
53350a9
chore: bump version to 2.4.0
claude Apr 16, 2026
f5a8c8f
fix: flight card layout — smFooter inside card, status pill own row
claude Apr 16, 2026
c4bf6ca
fix: remove dark-mode card border artifacts
claude Apr 16, 2026
f80f3db
feat: new app icon — airplane + badge (option 1)
claude Apr 17, 2026
c7e3693
feat: dark mode for TravelDoc WebView
claude Apr 17, 2026
55af719
fix: update Android mipmap icons to new airplane+badge design
claude Apr 17, 2026
7c2c61e
fix: make dark-mode card backgrounds fully opaque
claude Apr 17, 2026
5818cc1
fix: sync package.json version to 2.4.0, use new icon in drawer header
claude Apr 17, 2026
d624bcc
chore: rename app to AeroStaff Pro
claude Apr 17, 2026
ad37858
feat: realistic widget preview for Android picker
claude Apr 17, 2026
9ac8fc9
refactor: SecureStore for passwords, FlightRow React.memo, CI workflo…
claude Apr 17, 2026
64f5f07
fix: staffMonitor row filter was checking inner content instead of <t…
claude Apr 17, 2026
e5b243a
feat: apply airline filter to home timeline, shift flight count, and …
claude Apr 17, 2026
2584314
chore: bump version to 2.5.0 (versionCode 11)
claude Apr 17, 2026
58270e8
ci: trigger v2.5.0 build
TargetMisser Apr 17, 2026
89c42c1
ci: remove branch trigger, keep only tags/v* and workflow_dispatch
TargetMisser Apr 17, 2026
38bf934
fix: timeline re-fetches with current filter when Home tab gains focus
claude Apr 17, 2026
1690c30
ci: trigger v2.5.0 build (timeline filter fix)
TargetMisser Apr 17, 2026
74bd282
fix: staffMonitor row detection by flight number instead of CSS class
claude Apr 17, 2026
0d8e5d5
ci: trigger v2.5.0 build (staffMonitor robust row detection)
TargetMisser Apr 17, 2026
a5f93e2
fix: staffMonitor parser — checkin multi-desk, robust row/column dete…
claude Apr 17, 2026
5fa1cde
ci: trigger v2.5.0 build (staffMonitor robust parser)
TargetMisser Apr 17, 2026
ad194b0
fix: staffMonitor complete rewrite — correct URL, flight code extract…
claude Apr 17, 2026
13b6590
ci: trigger v2.5.0 build (staffMonitor full rewrite)
TargetMisser Apr 17, 2026
185a3fd
fix: staffMonitor fetches frame files directly (page is a frameset)
claude Apr 17, 2026
4a10ebe
feat: increase footer blur intensity + semi-opaque overlay for readab…
claude Apr 17, 2026
a753d66
feat: use @react-native-community/blur for real hardware blur on Android
claude Apr 17, 2026
6865750
revert: drop @react-native-community/blur, back to expo-blur + solid …
claude Apr 17, 2026
a83c1c2
fix: community blur with proper borderRadius clipping on Android
claude Apr 17, 2026
09a4ef4
fix: tab bar — drop community blur, use expo-blur + opaque overlay
claude Apr 18, 2026
e9196e2
fix: staffMonitor — correct URL + colspan-aware header detection
claude Apr 18, 2026
72338a6
fix: staffMonitor — add Referer/Accept headers to mimic browser request
claude Apr 18, 2026
de343bb
fix: normalizeFlightNumber handles mixed IATA codes (W4, U2, D8)
claude Apr 18, 2026
7a10549
debug: show StaffMonitor flight count in FlightScreen header
claude Apr 18, 2026
a03fcd8
debug: expose HTTP status + body length in SM debug banner
claude Apr 18, 2026
da7a1b1
debug: show first 5 SM dep flight numbers in banner
claude Apr 18, 2026
83f226f
fix: add 8s AbortController timeout to staffMonitor fetch
claude Apr 18, 2026
fab8fe7
fix: increase staffMonitor fetch timeout from 8s to 20s
claude Apr 18, 2026
81f4039
fix: deduplicate arrivals/departures by flight number + scheduled time
claude Apr 18, 2026
4370237
fix: reorder staffMonitor URLs and raise minimum body size to 8k
claude Apr 18, 2026
d2fc645
fix: restore trans=true first, accept responses with table content
claude Apr 18, 2026
4e653dc
debug: log first 300 chars of staffMonitor HTML response to banner
claude Apr 18, 2026
a000e1b
fix: accept any 200 OK response from staffMonitor, drop <tr check
claude Apr 18, 2026
e5b07b3
fix: validate widget cache date before showing rest/no_shift state
claude Apr 18, 2026
9d71c29
feat: in-app update checker via GitHub releases API
claude Apr 18, 2026
1b6229d
feat: Mihon-style update modal with changelog and download
claude Apr 18, 2026
bf8f0e4
chore: bump version to 2.6.0, update release notes
claude Apr 18, 2026
8a7816b
feat: add backup/restore and remove debug banner
claude Apr 19, 2026
b99e679
fix: staffMonitor column detection — remove stand/gate/belt requirement
claude Apr 19, 2026
c026e75
fix: widget shows rest day even when shift is upcoming
claude Apr 19, 2026
99f902b
fix: staffMonitor wrong stand column and phone number leaking into UI
claude Apr 19, 2026
67416cb
fix: Lavoro event overrides stale Riposo; add SM column debug
claude Apr 19, 2026
a573e09
fix: flight data auto-refresh every 2min + stable merge key
claude Apr 19, 2026
d53c97e
debug: show parsed SM flight numbers+stand values in debug alert
claude Apr 19, 2026
7981a97
feat: redesign update and backup sections in Settings
claude Apr 19, 2026
9fddea6
fix: extract operational code from stand/gate/checkin cells
claude Apr 19, 2026
4f11fea
fix: lower pure-letter reject threshold to 3 chars; show both D+A debug
claude Apr 19, 2026
9b29130
fix(HomeScreen): prioritise Lavoro event over Riposo when both exist …
claude Apr 19, 2026
fa24f2b
fix(staffMonitor): parallel URL racing + cache fallback for arrivals …
claude Apr 19, 2026
3c8866d
fix(staffMonitor): restore 25s timeout for D; remove non-nature=A fal…
claude Apr 19, 2026
4a385f3
chore: update release notes for v2.6.1 with all session fixes
claude Apr 19, 2026
43c7a2f
chore: bump version to 2.6.2
claude Apr 19, 2026
4ece2fc
fix(staffMonitor): forward Tomcat JSESSIONID from D to A requests
claude Apr 21, 2026
fb28204
merge: resolve conflict in build-release.yml — keep main's improved w…
claude Apr 25, 2026
e822346
chore: bump version to 2.6.3 (versionCode 12) for fresh APK build
claude Apr 25, 2026
11b2459
Merge remote-tracking branch 'origin/main' into claude/fix-shift-perm…
claude Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
166 changes: 0 additions & 166 deletions .github/workflows/build-apk.yml

This file was deleted.

2 changes: 1 addition & 1 deletion .github/workflows/build-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ jobs:
- **Numeri di telefono come stand**: `isPhoneOrJunk` individua sequenze di 8+ cifre ovunque nella stringa
- **Colonna "ADDETTO STAND"**: word-boundary `\bstand\b` per evitare falsi positivi
- **Arrivi in parallelo + cache**: 7 varianti URL `nature=A` in simultanea, prima risposta vince in ≤40s; cache AsyncStorage 20 min
- **Sessione Tomcat (JSESSIONID)**: cookie catturato dalla risposta D e inoltrato alle richieste A
- **Sessione Tomcat (JSESSIONID)**: cookie catturato dalla risposta D e inoltrato alle richieste A — fix AbortError sugli arrivi
- **Numeri volo corrotti**: rimossi URL fallback senza `nature=A`
- **Timeout partenze**: ripristinato a 25s

Expand Down
33 changes: 0 additions & 33 deletions .github/workflows/release-snapshot.yml

This file was deleted.

81 changes: 55 additions & 26 deletions App.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useState, useRef, useMemo, useEffect } from 'react';
import { View, Text, StyleSheet, TouchableOpacity, Platform, StatusBar, PanResponder, Animated, Dimensions, BackHandler } from 'react-native';
import { LinearGradient } from 'expo-linear-gradient';
import { BlurView } from 'expo-blur';
import { BlurView as ExpoBlurView } from 'expo-blur';
import * as Haptics from 'expo-haptics';
import { MaterialIcons } from '@expo/vector-icons';
import { ThemeProvider, useAppTheme } from './src/context/ThemeContext';
Expand All @@ -18,6 +18,8 @@ import SettingsScreen from './src/screens/SettingsScreen';
import PasswordScreen from './src/screens/PasswordScreen';
import DrawerMenu from './src/components/DrawerMenu';
import { autoScheduleNotifications } from './src/utils/autoNotifications';
import { checkForUpdate, wasUpdateSeen, markUpdateSeen, type UpdateInfo } from './src/utils/updateChecker';
import UpdateModal from './src/components/UpdateModal';

type Tab = 'Shifts' | 'Calendar' | 'Flights' | 'TravelDoc';
type OverlayScreen = 'Notepad' | 'Phonebook' | 'Passwords' | 'Manuals' | 'Settings' | null;
Expand Down Expand Up @@ -82,6 +84,7 @@ function AppInner() {
const [activeTab, setActiveTab] = useState<Tab>('Shifts');
const [drawerOpen, setDrawerOpen] = useState(false);
const [overlay, setOverlay] = useState<OverlayScreen>(null);
const [pendingUpdate, setPendingUpdate] = useState<UpdateInfo | null>(null);

const tabLabels: Record<Tab, string> = {
Shifts: t('tabHome'), Calendar: t('tabShifts'), Flights: t('tabFlights'), TravelDoc: t('tabTravelDoc'),
Expand All @@ -99,6 +102,12 @@ function AppInner() {
autoScheduleNotifications().then(count => {
if (count > 0 && __DEV__) console.log(`Auto-scheduled ${count} notifications`);
}).catch(() => {});
// Check for updates; show modal once per new version
checkForUpdate().then(async info => {
if (!info?.available) return;
const seen = await wasUpdateSeen(info.latestVersion);
if (!seen) setPendingUpdate(info);
}).catch(() => {});
}, []);

// ─── Android back button: overlay → home, drawer → close ───────────────────
Expand Down Expand Up @@ -167,7 +176,7 @@ function AppInner() {

const renderTabScreen = (tab: Tab) => {
switch (tab) {
case 'Shifts': return <HomeScreen />;
case 'Shifts': return <HomeScreen isFocused={activeTab === 'Shifts'} />;
case 'Calendar': return <CalendarScreen />;
case 'Flights': return <FlightScreen />;
case 'TravelDoc': return <TraveldocScreen />;
Expand All @@ -186,7 +195,7 @@ function AppInner() {
/>

{/* Top App Bar — liquid glass */}
<BlurView
<ExpoBlurView
intensity={colors.isDark ? 60 : 50}
tint={colors.isDark ? 'dark' : 'light'}
style={[styles.appBar, { borderBottomColor: colors.glassBorder }]}
Expand Down Expand Up @@ -215,7 +224,7 @@ function AppInner() {
>
<Text style={styles.avatarText}>MR</Text>
</LinearGradient>
</BlurView>
</ExpoBlurView>

{/* Screen Content */}
{isWeather ? (
Expand Down Expand Up @@ -248,25 +257,32 @@ function AppInner() {
{/* Bottom Nav — Glassmorphic Floating Pill (hidden on overlay screens) */}
{!overlay && (
<View style={styles.tabBarWrapper} {...swipePan.panHandlers}>
<BlurView intensity={80} tint={colors.isDark ? 'dark' : 'light'} style={styles.tabBarBlur}>
{TABS.map(tab => {
const active = activeTab === tab.id;
return (
<GlassTab
key={tab.id}
icon={tab.icon}
label={tabLabels[tab.id]}
focused={active}
activeColor={colors.tabIconActive}
inactiveColor={colors.tabIconInactive}
onPress={() => {
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
goToTab(TABS.findIndex(t => t.id === tab.id));
}}
/>
);
})}
</BlurView>
<View style={[styles.tabBarBlur, { backgroundColor: colors.isDark ? 'rgba(28,28,30,0.82)' : 'rgba(242,242,247,0.82)' }]}>
<ExpoBlurView
intensity={80}
tint={colors.isDark ? 'dark' : 'light'}
style={StyleSheet.absoluteFill}
/>
<View style={styles.tabBarRow}>
{TABS.map(tab => {
const active = activeTab === tab.id;
return (
<GlassTab
key={tab.id}
icon={tab.icon}
label={tabLabels[tab.id]}
focused={active}
activeColor={colors.tabIconActive}
inactiveColor={colors.tabIconInactive}
onPress={() => {
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
goToTab(TABS.findIndex(t => t.id === tab.id));
}}
/>
);
})}
</View>
</View>
</View>
)}

Expand All @@ -276,6 +292,15 @@ function AppInner() {
onClose={() => setDrawerOpen(false)}
onSelect={handleDrawerSelect}
/>
{pendingUpdate && (
<UpdateModal
info={pendingUpdate}
onDismiss={() => {
markUpdateSeen(pendingUpdate.latestVersion).catch(() => {});
setPendingUpdate(null);
}}
/>
)}
</View>
);
}
Expand Down Expand Up @@ -330,15 +355,19 @@ const styles = StyleSheet.create({
right: 16,
},
tabBarBlur: {
flexDirection: 'row',
height: 66,
borderRadius: 33,
justifyContent: 'space-around',
alignItems: 'center',
overflow: 'hidden',
borderWidth: 0.75,
borderColor: 'rgba(255,255,255,0.22)',
},
tabBarRow: {
flex: 1,
flexDirection: 'row',
height: 66,
justifyContent: 'space-around',
alignItems: 'center',
},
glassTab: {
alignItems: 'center',
justifyContent: 'center',
Expand Down
6 changes: 3 additions & 3 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,11 @@ android {

namespace 'com.anonymous.FlightWorkApp'
defaultConfig {
applicationId 'com.anonymous.FlightWorkApp'
applicationId 'com.aerostaffpro.app'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 7
versionName "1.3.6"
versionCode 12
versionName "2.6.3"

buildConfigField "String", "REACT_NATIVE_RELEASE_LEVEL", "\"${findProperty('reactNativeReleaseLevel') ?: 'stable'}\""
}
Expand Down
2 changes: 1 addition & 1 deletion android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
<receiver android:name=".widget.ShiftFlights" android:exported="false" android:label="Turno Voli">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
<action android:name="com.anonymous.FlightWorkApp.WIDGET_CLICK"/>
<action android:name="com.aerostaffpro.app.WIDGET_CLICK"/>
</intent-filter>
<meta-data android:name="android.appwidget.provider" android:resource="@xml/widgetprovider_shiftflights"/>
</receiver>
Expand Down
Binary file modified android/app/src/main/res/drawable/shiftflights_preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher_background.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher_monochrome.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher_background.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher_monochrome.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
2 changes: 1 addition & 1 deletion android/app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<resources>
<string name="app_name">FlightWorkApp</string>
<string name="app_name">AeroStaff Pro</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
<string name="widget_shiftflights_description" translatable="false">Voli del turno corrente con orari CI e Gate</string>
Expand Down
Loading
Loading