Files
notesnook/apps/mobile/src/components/attachments/index.js

107 lines
3.2 KiB
JavaScript
Raw Normal View History

2021-11-09 09:44:48 +05:00
import React, { useEffect, useRef, useState } from 'react';
2022-02-28 13:48:59 +05:00
import { View } from 'react-native';
2021-11-09 09:44:48 +05:00
import { FlatList } from 'react-native-gesture-handler';
2021-09-29 12:56:07 +05:00
import Icon from 'react-native-vector-icons/MaterialCommunityIcons';
2021-11-09 09:44:48 +05:00
import { useTracked } from '../../provider';
2022-01-22 12:57:05 +05:00
import { eSubscribeEvent, eUnSubscribeEvent } from '../../services/EventManager';
2021-11-09 09:44:48 +05:00
import { db } from '../../utils/database';
2022-02-28 13:48:59 +05:00
import { eCloseAttachmentDialog, eOpenAttachmentsDialog } from '../../utils/events';
import { SIZE } from '../../utils/size';
import DialogHeader from '../dialog/dialog-header';
import SheetWrapper from '../ui/sheet';
import Paragraph from '../ui/typography/paragraph';
import { AttachmentItem } from './attachment-item';
2021-09-29 12:56:07 +05:00
export const AttachmentDialog = () => {
const [state] = useTracked();
const colors = state.colors;
const [visible, setVisible] = useState(false);
const [note, setNote] = useState(null);
const actionSheetRef = useRef();
2021-10-01 12:03:25 +05:00
const [attachments, setAttachments] = useState([]);
2021-09-29 12:56:07 +05:00
useEffect(() => {
2021-10-01 12:03:25 +05:00
eSubscribeEvent(eOpenAttachmentsDialog, open);
eSubscribeEvent(eCloseAttachmentDialog, close);
2021-09-29 12:56:07 +05:00
return () => {
2021-10-01 12:03:25 +05:00
eUnSubscribeEvent(eOpenAttachmentsDialog, open);
eUnSubscribeEvent(eCloseAttachmentDialog, close);
2021-09-29 12:56:07 +05:00
};
2021-10-01 12:03:25 +05:00
}, [visible]);
2021-09-29 12:56:07 +05:00
const open = item => {
setNote(item);
setVisible(true);
2022-01-22 12:57:05 +05:00
let _attachments = db.attachments.ofNote(item.id, 'all');
2021-10-01 12:03:25 +05:00
setAttachments(_attachments);
2021-09-29 12:56:07 +05:00
};
useEffect(() => {
if (visible) {
actionSheetRef.current?.show();
}
}, [visible]);
const close = () => {
actionSheetRef.current?.hide();
2021-10-01 12:03:25 +05:00
setVisible(false);
2021-09-29 12:56:07 +05:00
};
2021-10-01 12:03:25 +05:00
return !visible ? null : (
2021-12-25 11:16:33 +05:00
<SheetWrapper
2021-09-29 12:56:07 +05:00
centered={false}
fwdRef={actionSheetRef}
onClose={async () => {
setVisible(false);
2022-01-22 12:57:05 +05:00
}}
>
2021-09-29 12:56:07 +05:00
<View
style={{
width: '100%',
alignSelf: 'center',
2021-10-01 12:03:25 +05:00
paddingHorizontal: 12
2022-01-22 12:57:05 +05:00
}}
>
2021-09-29 12:56:07 +05:00
<DialogHeader title="Attachments" />
2021-10-01 12:03:25 +05:00
<FlatList
2021-09-29 12:56:07 +05:00
nestedScrollEnabled
overScrollMode="never"
scrollToOverflowEnabled={false}
keyboardDismissMode="none"
keyboardShouldPersistTaps="always"
onMomentumScrollEnd={() => {
actionSheetRef.current?.handleChildScrollEnd();
2021-10-01 12:03:25 +05:00
}}
ListEmptyComponent={
<View
style={{
height: 150,
justifyContent: 'center',
alignItems: 'center'
2022-01-22 12:57:05 +05:00
}}
>
2021-10-01 12:03:25 +05:00
<Icon name="attachment" size={60} color={colors.icon} />
<Paragraph>No attachments on this note</Paragraph>
</View>
}
data={attachments}
2022-01-22 12:57:05 +05:00
renderItem={({ item, index }) => (
2022-02-28 13:48:59 +05:00
<AttachmentItem attachment={item} note={note} setNote={setNote} />
2021-10-01 12:03:25 +05:00
)}
/>
<Paragraph
color={colors.icon}
size={SIZE.xs}
style={{
textAlign: 'center',
marginTop: 10
2022-01-22 12:57:05 +05:00
}}
>
2021-10-01 12:03:25 +05:00
<Icon name="shield-key-outline" size={SIZE.xs} color={colors.icon} />
{' '}All attachments are end-to-end encrypted.
</Paragraph>
2021-09-29 12:56:07 +05:00
</View>
2021-12-25 11:16:33 +05:00
</SheetWrapper>
2021-09-29 12:56:07 +05:00
);
};