custom tags
This commit is contained in:
@@ -15,6 +15,8 @@ import { useCategories } from '@/hooks/useDatabase';
|
||||
import { getAuthUser, getAuthToken } from '@/services/auth';
|
||||
import { checkForUpdates, getCurrentAppVersion } from '@/services/updates';
|
||||
import { getLastSyncTime } from '@/database/sync';
|
||||
import { rescheduleAllReminders } from '@/services/notifications';
|
||||
import { collections } from '@/database';
|
||||
import Category from '@/models/Category';
|
||||
import Svg, { Path } from 'react-native-svg';
|
||||
import ColorWheel from '@/components/ColorWheel';
|
||||
@@ -22,9 +24,10 @@ import { getLastVisitedTab, tabHref } from '@/utils/tabHistory';
|
||||
|
||||
export default function SettingsScreen() {
|
||||
const router = useRouter();
|
||||
const { theme, notifications, setNotifications, defaultCategoryId, setDefaultCategoryId, sortBy, setSortBy, reminderPreference, setReminderPreference, apiUrl, accentColor, setAccentColor, todoAheadDays, setTodoAheadDays, showCompleted, setShowCompleted } = useSettings();
|
||||
const { theme, notifications, setNotifications, defaultCategoryId, setDefaultCategoryId, sortBy, setSortBy, reminderPreference, setReminderPreference, tagReminderPreferences, setTagReminderPreferences, apiUrl, accentColor, setAccentColor, todoAheadDays, setTodoAheadDays, showCompleted, setShowCompleted, deleteBySwipe, setDeleteBySwipe } = useSettings();
|
||||
const categories = useCategories();
|
||||
const [picker, setPicker] = useState<null | 'category' | 'sort' | 'reminder' | 'todoAhead'>(null);
|
||||
const [reminderTagPicker, setReminderTagPicker] = useState<Category | null>(null);
|
||||
const [editingCategory, setEditingCategory] = useState<Category | null | 'new'>(null);
|
||||
const [syncVisible, setSyncVisible] = useState(false);
|
||||
const [friendsVisible, setFriendsVisible] = useState(false);
|
||||
@@ -95,6 +98,14 @@ export default function SettingsScreen() {
|
||||
const defaultCategoryLabel = defaultCategory?.name ?? 'None';
|
||||
const reminderLabel = REMINDER_OPTIONS.find((o) => o.value === reminderPreference)?.label ?? 'No reminder';
|
||||
|
||||
const tagReminderLabel = (categoryId: string) => {
|
||||
const selected = tagReminderPreferences[categoryId] ?? [];
|
||||
if (selected.length === 0) return `Default (${reminderLabel})`;
|
||||
return selected
|
||||
.map((v) => REMINDER_OPTIONS.find((o) => o.value === v)?.label ?? v)
|
||||
.join(', ');
|
||||
};
|
||||
|
||||
const openCustomAccent = () => {
|
||||
setDraftAccent(accentColor);
|
||||
setCustomAccentVisible(true);
|
||||
@@ -108,6 +119,20 @@ export default function SettingsScreen() {
|
||||
setReminderPreference((Array.isArray(value) ? value[0] : value) as typeof reminderPreference);
|
||||
};
|
||||
|
||||
const handleTagReminderPreference = async (categoryId: string, value: string | string[]) => {
|
||||
const selected = (Array.isArray(value) ? value : [value]).filter(
|
||||
(v): v is typeof reminderPreference => v !== 'none'
|
||||
);
|
||||
setTagReminderPreferences({ ...tagReminderPreferences, [categoryId]: selected });
|
||||
if (!notifications) return;
|
||||
try {
|
||||
const tasks = await collections.tasks.query().fetch();
|
||||
await rescheduleAllReminders(tasks, notifications, reminderPreference);
|
||||
} catch {
|
||||
// ignore reschedule failures
|
||||
}
|
||||
};
|
||||
|
||||
const handleTodoAheadDays = (value: string | string[]) => {
|
||||
setTodoAheadDays(parseInt(Array.isArray(value) ? value[0] : value, 10));
|
||||
};
|
||||
@@ -163,6 +188,18 @@ export default function SettingsScreen() {
|
||||
onPress={() => notifications && setPicker('reminder')}
|
||||
showChevron
|
||||
/>
|
||||
{categories.map((category) => (
|
||||
<ListItem
|
||||
key={`tag-reminder-${category.id}`}
|
||||
title={category.name}
|
||||
subtitle={notifications ? tagReminderLabel(category.id) : 'Enable notifications first'}
|
||||
leftElement={
|
||||
<View style={[styles.categoryDot, { backgroundColor: category.color }]} />
|
||||
}
|
||||
onPress={() => notifications && setReminderTagPicker(category)}
|
||||
showChevron
|
||||
/>
|
||||
))}
|
||||
<Text style={[styles.sectionTitle, { color: theme.textMuted }]}>Tasks</Text>
|
||||
<ListItem
|
||||
title="Default Tag"
|
||||
@@ -188,6 +225,19 @@ export default function SettingsScreen() {
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<ListItem
|
||||
title="Delete by Swiping"
|
||||
subtitle="Swipe right to delete task"
|
||||
rightElement={
|
||||
<Switch
|
||||
value={deleteBySwipe}
|
||||
onValueChange={setDeleteBySwipe}
|
||||
thumbColor="#FFFFFF"
|
||||
trackColor={{ false: theme.borderStrong, true: theme.accent }}
|
||||
/>
|
||||
}
|
||||
showChevron
|
||||
/>
|
||||
<ListItem
|
||||
title="Show Calendar Tasks"
|
||||
subtitle={todoAheadDays === 0 ? 'Only today' : `Up to ${todoAheadDays} days ahead`}
|
||||
@@ -294,6 +344,19 @@ export default function SettingsScreen() {
|
||||
onClose={() => setPicker(null)}
|
||||
/>
|
||||
|
||||
{categories.map((category) => (
|
||||
<OptionPickerModal
|
||||
key={`tag-reminder-picker-${category.id}`}
|
||||
visible={reminderTagPicker?.id === category.id}
|
||||
title={`Reminders · ${category.name}`}
|
||||
options={REMINDER_OPTIONS.filter((o) => o.value !== 'none')}
|
||||
selectedValue={tagReminderPreferences[category.id] ?? []}
|
||||
multiSelect
|
||||
onSelect={(value) => handleTagReminderPreference(category.id, value)}
|
||||
onClose={() => setReminderTagPicker(null)}
|
||||
/>
|
||||
))}
|
||||
|
||||
<OptionPickerModal
|
||||
visible={picker === 'todoAhead'}
|
||||
title="Calendar Tasks in Todo"
|
||||
|
||||
Reference in New Issue
Block a user