import React, { useCallback } from 'react'; import { Box, Button, color, Spinner, Text } from 'folds'; import { MatrixError } from 'matrix-js-sdk'; import { SequenceCard } from '../../../components/sequence-card'; import { SequenceCardStyle } from '../../room-settings/styles.css'; import { SettingTile } from '../../../components/setting-tile'; import { useMatrixClient } from '../../../hooks/useMatrixClient'; import { useRoom } from '../../../hooks/useRoom'; import { StateEvent } from '../../../../types/matrix/room'; import { AsyncStatus, useAsyncCallback } from '../../../hooks/useAsyncCallback'; import { useStateEvent } from '../../../hooks/useStateEvent'; import { RoomPermissionsAPI } from '../../../hooks/useRoomPermissions'; import { RetentionContent, RETENTION_PRESETS } from '../../../utils/retention'; type RoomRetentionProps = { permissions: RoomPermissionsAPI; }; export function RoomRetention({ permissions }: RoomRetentionProps) { const mx = useMatrixClient(); const room = useRoom(); const canEdit = permissions.stateEvent(StateEvent.RoomRetention, mx.getSafeUserId()); const event = useStateEvent(room, StateEvent.RoomRetention); const currentMs = event?.getContent().max_lifetime ?? 0; const [submitState, submit] = useAsyncCallback( useCallback( async (ms: number) => { const content: RetentionContent = ms > 0 ? { max_lifetime: ms } : {}; // Lotus custom-state convention: cast the type key (RoomRetention isn't a // typed key in the SDK's StateEvents map). // eslint-disable-next-line @typescript-eslint/no-explicit-any await mx.sendStateEvent(room.roomId, StateEvent.RoomRetention as any, content); }, [mx, room.roomId], ), ); const submitting = submitState.status === AsyncStatus.Loading; return ( {RETENTION_PRESETS.map((preset) => { const active = currentMs === preset.ms; return ( ); })} {submitting && } {submitState.status === AsyncStatus.Error && ( {(submitState.error as MatrixError).message} )} ); }