Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
51 changes: 24 additions & 27 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions src/constants/shifts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export const SHIFT_TITLE_WORK = 'Lavoro';
export const SHIFT_TITLE_REST = 'Riposo';
7 changes: 4 additions & 3 deletions src/screens/CalendarScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import {
getPdfExtractorHtml, parseShiftCells,
type ParsedSchedule, type ParsedEmployee, type ParsedShift,
} from '../utils/pdfShiftParser';
import { SHIFT_TITLE_REST, SHIFT_TITLE_WORK } from '../constants/shifts';

const PRIMARY = '#2563EB';
const STORAGE_KEY = '@shift_import_name';
Expand Down Expand Up @@ -522,19 +523,19 @@ export default function CalendarScreen() {
{/* Tipo */}
<Text style={[s.manualLabel, { color: colors.textSub }]}>TIPO</Text>
<View style={{ flexDirection: 'row', gap: 10, marginBottom: 16 }}>
{(['Lavoro', 'Riposo'] as const).map(t => (
{([SHIFT_TITLE_WORK, SHIFT_TITLE_REST] as const).map(t => (
<TouchableOpacity
key={t}
style={[s.manualTypeBtn, { borderColor: colors.border }, manualType === t && { backgroundColor: colors.primary, borderColor: colors.primary }]}
onPress={() => setManualType(t)}
>
<Text style={{ color: manualType === t ? '#fff' : colors.text, fontWeight: '700' }}>{t === 'Lavoro' ? '✈️ Lavoro' : '🌴 Riposo'}</Text>
<Text style={{ color: manualType === t ? '#fff' : colors.text, fontWeight: '700' }}>{t === SHIFT_TITLE_WORK ? `✈️ ${SHIFT_TITLE_WORK}` : `🌴 ${SHIFT_TITLE_REST}`}</Text>
</TouchableOpacity>
))}
</View>

{/* Orari (solo lavoro) */}
{manualType === 'Lavoro' && (
{manualType === SHIFT_TITLE_WORK && (
<>
<Text style={[s.manualLabel, { color: colors.textSub }]}>ORARIO INIZIO</Text>
<View style={s.manualTimeRow}>
Expand Down
5 changes: 3 additions & 2 deletions src/screens/FlightScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { requestWidgetUpdate } from 'react-native-android-widget';
import { WIDGET_CACHE_KEY } from '../widgets/widgetTaskHandler';
import type { WidgetData, WidgetFlight } from '../widgets/widgetTaskHandler';
import { ShiftWidget } from '../widgets/ShiftWidget';
import { SHIFT_TITLE_REST, SHIFT_TITLE_WORK } from '../constants/shifts';

const WearDataSender = Platform.OS === 'android' ? NativeModules.WearDataSender : null;

Expand Down Expand Up @@ -311,12 +312,12 @@ export default function FlightScreen() {
const todayEnd = new Date(todayStart); todayEnd.setHours(23, 59, 59, 999);
const tomorrowStart = new Date(todayStart); tomorrowStart.setDate(tomorrowStart.getDate() + 1);
for (const e of evts) {
if (e.title.includes('Riposo')) {
if (e.title.includes(SHIFT_TITLE_REST)) {
const evtDay = new Date(e.startDate);
if (evtDay >= todayStart && evtDay <= todayEnd) isRestDay = true;
continue;
}
if (!e.title.includes('Lavoro')) continue;
if (!e.title.includes(SHIFT_TITLE_WORK)) continue;
const s = new Date(e.startDate).getTime() / 1000;
const en = new Date(e.endDate).getTime() / 1000;
const evtDay = new Date(e.startDate);
Expand Down
25 changes: 13 additions & 12 deletions src/screens/HomeScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
replaceShiftForDate,
replaceShiftsForRange,
} from '../utils/shiftCalendar';
import { SHIFT_TITLE_REST, SHIFT_TITLE_WORK } from '../constants/shifts';

const GOLD = '#F59E0B';

Expand All @@ -27,7 +28,7 @@ if (Platform.OS === 'android' && UIManager.setLayoutAnimationEnabledExperimental
}

const PINNED_FLIGHT_KEY = 'pinned_flight_v1';
const HOME_SHIFT_TITLES = { work: 'Turno Lavoro ✈️', rest: '🌴 Riposo' };
const HOME_SHIFT_TITLES = { work: `Turno ${SHIFT_TITLE_WORK} ✈️`, rest: `🌴 ${SHIFT_TITLE_REST}` };
const HOME_REST_TIMING = { startHour: 12, startMinute: 0, endHour: 14, endMinute: 0, allDay: true };

const weatherMap: Record<number, { text: string; icon: string }> = {
Expand Down Expand Up @@ -158,7 +159,7 @@ export default function HomeScreen() {
const [processing, setProcessing] = useState(false);

const [shiftModalOpen, setShiftModalOpen] = useState(false);
const [newShiftType, setNewShiftType] = useState<'Lavoro' | 'Riposo'>('Lavoro');
const [newShiftType, setNewShiftType] = useState<typeof SHIFT_TITLE_WORK | typeof SHIFT_TITLE_REST>(SHIFT_TITLE_WORK);
const [newStartH, setNewStartH] = useState('08');
const [newStartM, setNewStartM] = useState('00');
const [newEndH, setNewEndH] = useState('16');
Expand Down Expand Up @@ -197,15 +198,15 @@ export default function HomeScreen() {

const openModifyModal = () => {
if (shiftEvent) {
setNewShiftType(isRest ? 'Riposo' : 'Lavoro');
setNewShiftType(isRest ? SHIFT_TITLE_REST : SHIFT_TITLE_WORK);
const start = new Date(shiftEvent.startDate);
const end = new Date(shiftEvent.endDate);
setNewStartH(start.getHours().toString().padStart(2, '0'));
setNewStartM(start.getMinutes().toString().padStart(2, '0'));
setNewEndH(end.getHours().toString().padStart(2, '0'));
setNewEndM(end.getMinutes().toString().padStart(2, '0'));
} else {
setNewShiftType('Lavoro');
setNewShiftType(SHIFT_TITLE_WORK);
setNewStartH('08'); setNewStartM('00'); setNewEndH('16'); setNewEndM('00');
}
setShiftModalOpen(true);
Expand All @@ -227,9 +228,9 @@ export default function HomeScreen() {
await replaceShiftForDate({
calendarId,
date,
type: newShiftType === 'Riposo' ? 'rest' : 'work',
startTime: newShiftType === 'Lavoro' ? `${newStartH.padStart(2, '0')}:${newStartM.padStart(2, '0')}` : undefined,
endTime: newShiftType === 'Lavoro' ? `${newEndH.padStart(2, '0')}:${newEndM.padStart(2, '0')}` : undefined,
type: newShiftType === SHIFT_TITLE_REST ? 'rest' : 'work',
startTime: newShiftType === SHIFT_TITLE_WORK ? `${newStartH.padStart(2, '0')}:${newStartM.padStart(2, '0')}` : undefined,
endTime: newShiftType === SHIFT_TITLE_WORK ? `${newEndH.padStart(2, '0')}:${newEndM.padStart(2, '0')}` : undefined,
titles: HOME_SHIFT_TITLES,
restTiming: HOME_REST_TIMING,
});
Expand All @@ -251,7 +252,7 @@ export default function HomeScreen() {
d.setHours(0, 0, 0, 0);
const dEnd = new Date(); dEnd.setHours(23, 59, 59, 999);
const events = await Calendar.getEventsAsync([cal.id], d, dEnd);
const shift = events.find(e => e.title.includes('Lavoro') || e.title.includes('Riposo'));
const shift = events.find(e => e.title.includes(SHIFT_TITLE_WORK) || e.title.includes(SHIFT_TITLE_REST));
setShiftEvent(shift || null);
} catch (e) { console.error('[shift]', e); } finally { setLoadingShift(false); }
};
Expand Down Expand Up @@ -350,8 +351,8 @@ export default function HomeScreen() {
} catch (e: any) { Alert.alert('Errore Calendario', e.message); }
};

const isRest = shiftEvent?.title?.includes('Riposo');
const isWork = shiftEvent?.title?.includes('Lavoro');
const isRest = shiftEvent?.title?.includes(SHIFT_TITLE_REST);
const isWork = shiftEvent?.title?.includes(SHIFT_TITLE_WORK);
const s = useMemo(() => makeStyles(colors), [colors]);

return (
Expand Down Expand Up @@ -397,7 +398,7 @@ export default function HomeScreen() {
<View style={s.shiftBadgeRow}>
<View style={s.inProgressBadge}><Text style={s.inProgressText}>IN CORSO</Text></View>
</View>
<Text style={s.shiftTitle}>Turno Lavoro ✈️</Text>
<Text style={s.shiftTitle}>Turno {SHIFT_TITLE_WORK} ✈️</Text>
<Text style={s.shiftTime}>
{new Date(shiftEvent.startDate).toLocaleTimeString('it-IT',{hour:'2-digit',minute:'2-digit'})} – {new Date(shiftEvent.endDate).toLocaleTimeString('it-IT',{hour:'2-digit',minute:'2-digit'})}
</Text>
Expand All @@ -406,7 +407,7 @@ export default function HomeScreen() {
) : isRest ? (
<View style={s.restRow}>
<Text style={{ fontSize: 28, marginRight: 12 }}>🌴</Text>
<Text style={s.restText}>Giorno di Riposo</Text>
<Text style={s.restText}>Giorno di {SHIFT_TITLE_REST}</Text>
</View>
) : (
<Text style={s.emptyShift}>Nessun turno per oggi</Text>
Expand Down
9 changes: 5 additions & 4 deletions src/screens/ShiftScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { View, Text, StyleSheet, ActivityIndicator, ScrollView, Alert, Touchable
import * as ImagePicker from 'expo-image-picker';
import { WebView } from 'react-native-webview';
import * as Calendar from 'expo-calendar';
import { SHIFT_TITLE_REST, SHIFT_TITLE_WORK } from '../constants/shifts';

const PRIMARY = '#2563EB';
const DARK_BLUE = '#1E3A8A';
Expand Down Expand Up @@ -136,11 +137,11 @@ export default function ShiftScreen() {

const isDuplicate = existingEvents.some(e => {
if (s.isRest) {
return e.title.includes("Riposo");
return e.title.includes(SHIFT_TITLE_REST);
} else {
// Verifica se c'è già un turno di lavoro che inizia alla stessa ora
const eStart = new Date(e.startDate);
return e.title.includes("Lavoro") && eStart.getHours() === s.startH;
return e.title.includes(SHIFT_TITLE_WORK) && eStart.getHours() === s.startH;
}
});

Expand All @@ -153,7 +154,7 @@ export default function ShiftScreen() {
const alldayStart = new Date(d.year, d.month, d.day, 12, 0, 0);
const alldayEnd = new Date(d.year, d.month, d.day, 14, 0, 0);
await Calendar.createEventAsync(targetCalendar.id, {
title: "🌴 Riposo",
title: `🌴 ${SHIFT_TITLE_REST}`,
startDate: alldayStart,
endDate: alldayEnd,
allDay: true,
Expand All @@ -173,7 +174,7 @@ export default function ShiftScreen() {
}

await Calendar.createEventAsync(targetCalendar.id, {
title: "Turno Lavoro ✈️",
title: `Turno ${SHIFT_TITLE_WORK} ✈️`,
startDate: startDate,
endDate: endDate,
notes: "Dati estratti: " + d.raw + " -> " + s.raw,
Expand Down
Loading
Loading