Handle no-tasks mode in guest v2
This commit is contained in:
@@ -57,4 +57,14 @@ describe('TaskDetailScreen', () => {
|
||||
|
||||
expect(await screen.findByText('Capture the dancefloor')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('shows disabled state when tasks are disabled', () => {
|
||||
render(
|
||||
<EventDataProvider token="token" tasksEnabledFallback={false}>
|
||||
<TaskDetailScreen />
|
||||
</EventDataProvider>
|
||||
);
|
||||
|
||||
expect(screen.getByText('Tasks are disabled')).toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -497,7 +497,9 @@ export default function AchievementsScreen() {
|
||||
<XStack gap="$2" flexWrap="nowrap" overflow="hidden">
|
||||
{[
|
||||
{ label: t('achievements.summary.photosShared', 'Photos shared'), value: summary.totalPhotos },
|
||||
{ label: t('achievements.summary.tasksCompleted', 'Tasks completed'), value: summary.tasksSolved },
|
||||
...(tasksEnabled
|
||||
? [{ label: t('achievements.summary.tasksCompleted', 'Tasks completed'), value: summary.tasksSolved }]
|
||||
: []),
|
||||
{ label: t('achievements.summary.likesCollected', 'Likes collected'), value: summary.likesTotal },
|
||||
{ label: t('achievements.summary.uniqueGuests', 'Guests involved'), value: summary.uniqueGuests },
|
||||
].map((item) => (
|
||||
|
||||
@@ -35,7 +35,7 @@ function getTaskList(task: TaskItem, key: string): string[] {
|
||||
}
|
||||
|
||||
export default function TaskDetailScreen() {
|
||||
const { token } = useEventData();
|
||||
const { token, tasksEnabled } = useEventData();
|
||||
const { taskId } = useParams<{ taskId: string }>();
|
||||
const { t, locale } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
@@ -45,6 +45,37 @@ export default function TaskDetailScreen() {
|
||||
const [loading, setLoading] = React.useState(true);
|
||||
const [error, setError] = React.useState<string | null>(null);
|
||||
|
||||
if (!tasksEnabled) {
|
||||
return (
|
||||
<AppShell>
|
||||
<YStack gap="$4">
|
||||
<SurfaceCard>
|
||||
<Text fontSize="$4" fontWeight="$7">
|
||||
{t('tasks.disabled.title', 'Tasks are disabled')}
|
||||
</Text>
|
||||
<Text fontSize="$2" color={mutedText} marginTop="$2">
|
||||
{t('tasks.disabled.subtitle', 'This event is set to photo-only mode.')}
|
||||
</Text>
|
||||
<Button
|
||||
size="$4"
|
||||
borderRadius="$pill"
|
||||
backgroundColor="$primary"
|
||||
marginTop="$4"
|
||||
onPress={() => navigate(buildEventPath(token, '/upload'))}
|
||||
>
|
||||
<XStack alignItems="center" justifyContent="center" gap="$2" width="100%">
|
||||
<Camera size={18} color="white" />
|
||||
<Text fontSize="$3" fontWeight="$7" color="white">
|
||||
{t('homeV2.captureReady.cta', 'Upload / Take photo')}
|
||||
</Text>
|
||||
</XStack>
|
||||
</Button>
|
||||
</SurfaceCard>
|
||||
</YStack>
|
||||
</AppShell>
|
||||
);
|
||||
}
|
||||
|
||||
React.useEffect(() => {
|
||||
let active = true;
|
||||
if (!token || !taskId) {
|
||||
|
||||
@@ -31,7 +31,7 @@ function getTaskValue(task: TaskItem, key: string): string | undefined {
|
||||
}
|
||||
|
||||
export default function UploadScreen() {
|
||||
const { token, event } = useEventData();
|
||||
const { token, event, tasksEnabled } = useEventData();
|
||||
const identity = useOptionalGuestIdentity();
|
||||
const { items, add } = useUploadQueue();
|
||||
const navigate = useNavigate();
|
||||
@@ -73,7 +73,7 @@ export default function UploadScreen() {
|
||||
const sendingCount = items.filter((item) => item.status === 'uploading').length;
|
||||
const taskIdParam = searchParams.get('taskId');
|
||||
const parsedTaskId = taskIdParam ? Number(taskIdParam) : NaN;
|
||||
const taskId = Number.isFinite(parsedTaskId) ? parsedTaskId : undefined;
|
||||
const taskId = tasksEnabled && Number.isFinite(parsedTaskId) ? parsedTaskId : undefined;
|
||||
const [task, setTask] = React.useState<TaskItem | null>(null);
|
||||
const [taskLoading, setTaskLoading] = React.useState(false);
|
||||
const [taskError, setTaskError] = React.useState<string | null>(null);
|
||||
@@ -128,7 +128,7 @@ export default function UploadScreen() {
|
||||
React.useEffect(() => {
|
||||
let active = true;
|
||||
|
||||
if (!token || !taskId) {
|
||||
if (!token || !taskId || !tasksEnabled) {
|
||||
setTask(null);
|
||||
setTaskLoading(false);
|
||||
setTaskError(null);
|
||||
@@ -158,7 +158,7 @@ export default function UploadScreen() {
|
||||
return () => {
|
||||
active = false;
|
||||
};
|
||||
}, [locale, t, taskId, token]);
|
||||
}, [locale, t, taskId, tasksEnabled, token]);
|
||||
|
||||
const enqueueFile = React.useCallback(
|
||||
async (file: File) => {
|
||||
|
||||
Reference in New Issue
Block a user