diff --git a/src/assets/comments.png b/src/assets/comments.png new file mode 100644 index 0000000..ebd856b Binary files /dev/null and b/src/assets/comments.png differ diff --git a/src/assets/progress.png b/src/assets/progress.png deleted file mode 100644 index 11df4ce..0000000 Binary files a/src/assets/progress.png and /dev/null differ diff --git a/src/components/AppActionSheet.js b/src/components/AppActionSheet.js index 499a6cb..77411f1 100644 --- a/src/components/AppActionSheet.js +++ b/src/components/AppActionSheet.js @@ -3,8 +3,10 @@ import React from "react"; import ActionSheet from "react-native-actions-sheet"; import { gutters, Palette } from "../styles"; import { BlurView } from "expo-blur"; +import { useSafeAreaInsets } from "react-native-safe-area-context"; const AppActionSheet = ({ children, props }) => { + const insets = useSafeAreaInsets(); return ( { style={{ paddingTop: 36, paddingHorizontal: 14, - paddingBottom: gutters, + paddingBottom: gutters + (insets?.bottom || 0), backgroundColor: Palette.glass, borderTopLeftRadius: 20, borderTopRightRadius: 20, diff --git a/src/components/BottomSheetContainer.js b/src/components/BottomSheetContainer.js index e5d838a..a485e19 100644 --- a/src/components/BottomSheetContainer.js +++ b/src/components/BottomSheetContainer.js @@ -1,12 +1,12 @@ -import React, { useState, useCallback, useEffect } from "react"; -import { Keyboard, StyleSheet } from "react-native"; import { AnimatePresence, Motion } from "@legendapp/motion"; import { useKeyboard } from "@react-native-community/hooks"; +import React, { useCallback, useEffect, useState } from "react"; +import { Keyboard, StyleSheet } from "react-native"; import BottomSheet from "./BottomSheet"; -import { Palette } from "../styles"; import useLayoutType from "../hooks/useLayoutType"; +import { Palette } from "../styles"; export default ({ children, diff --git a/src/components/modal/CommentsModal.js b/src/components/modal/CommentsModal.js new file mode 100644 index 0000000..d344df3 --- /dev/null +++ b/src/components/modal/CommentsModal.js @@ -0,0 +1,216 @@ +import { BlurView } from "expo-blur"; +import React, { useMemo, useState } from "react"; +import { + Image, + Platform, + Pressable, + Text, + TextInput, + View, +} from "react-native"; +import { icons } from "../../assets"; +import { projectsRef, serverTimestamp } from "../../config/firebase"; +import useDataFromRef from "../../hooks/useDataFromRef"; +import { useUser } from "../../providers/UserDataProvider"; +import { Palette } from "../../styles"; +import { FONT_FAMILY } from "../../styles/Fonts"; +import { size } from "../../styles/Style"; +import AppActionSheet from "../AppActionSheet"; + +const formatRelativeTime = (date) => { + try { + const d = date instanceof Date ? date : date?.toDate?.() || null; + if (!d) return ""; + const diff = Math.max(0, Date.now() - d.getTime()); + const sec = Math.floor(diff / 1000); + if (sec < 60) return `${sec}s`; + const min = Math.floor(sec / 60); + if (min < 60) return `${min}min`; + const h = Math.floor(min / 60); + if (h < 24) return `${h}h`; + const dA = Math.floor(h / 24); + return `${dA}j`; + } catch (e) { + return ""; + } +}; + +const CommentsModal = ({ sheetId, payload }) => { + const projectId = payload?.projectId || null; + const { currentUID, currentUserData } = useUser(); + const [text, setText] = useState(""); + + const commentsRef = useMemo(() => { + try { + return projectId + ? projectsRef + .doc(projectId) + .collection("comments") + .orderBy("createdAt", "desc") + : null; + } catch (e) { + return null; + } + }, [projectId]); + + const { data: comments = [] } = useDataFromRef({ + ref: commentsRef, + simpleRef: false, + listener: true, + condition: !!commentsRef, + refreshArray: [projectId], + }); + + const onSend = async () => { + const value = (text || "").trim(); + if (!value || !projectId || !currentUID) return; + try { + setText(""); + const docRef = projectsRef.doc(projectId).collection("comments"); + await docRef.add({ + userId: currentUID, + userName: currentUserData?.userName || "", + profilePicture: currentUserData?.profilePictureURL || "", + text: value, + createdAt: serverTimestamp(), + }); + } catch (e) { + // Ignore + } + }; + + return ( + + + + Commentaires + + + {Array.isArray(comments) && comments.length > 0 ? ( + comments.map((c) => ( + + {c?.profilePicture ? ( + + ) : ( + + )} + + + + {c?.userId === currentUID ? "vous" : c?.userName || ""} + + + • {formatRelativeTime(c?.createdAt)} + + + + {c?.text} + + + + )) + ) : ( + + Aucun commentaire pour le moment + + )} + + + + + + + + + + + + + ); +}; + +export default CommentsModal; diff --git a/src/providers/BottomSheetProvider.js b/src/providers/BottomSheetProvider.js index 23cea9b..def248c 100644 --- a/src/providers/BottomSheetProvider.js +++ b/src/providers/BottomSheetProvider.js @@ -1,9 +1,9 @@ -import React, { useState, useRef, createContext } from "react"; -import { View, TouchableOpacity } from "react-native"; import { Motion } from "@legendapp/motion"; +import React, { createContext, useRef, useState } from "react"; +import { TouchableOpacity, View } from "react-native"; -import { mainBorderRadius } from "../styles/Style"; import { Palette } from "../styles"; +import { mainBorderRadius } from "../styles/Style"; export const BottomSheetContext = createContext(); diff --git a/src/screens/Playbacks.js b/src/screens/Playbacks.js index 8f6f323..515cdd9 100644 --- a/src/screens/Playbacks.js +++ b/src/screens/Playbacks.js @@ -10,6 +10,7 @@ import React, { useState, } from "react"; import { Image, Platform, Pressable, Text, View } from "react-native"; +import { SheetManager } from "react-native-actions-sheet"; import Carousel from "react-native-reanimated-carousel"; import { responsiveHeight } from "react-native-responsive-dimensions"; import { icons, img } from "../assets"; @@ -353,6 +354,18 @@ const PlaybackItem = ({ item, isActive, userCache, getUserByUid }) => { )} + { + if (item?.id) { + SheetManager.show("Comments", { + payload: { projectId: item.id }, + }); + } + }} + style={{ alignItems: "center" }} + > + + diff --git a/src/utils/Sheet.js b/src/utils/Sheet.js index 1ac8bf8..1a3e645 100644 --- a/src/utils/Sheet.js +++ b/src/utils/Sheet.js @@ -5,6 +5,7 @@ import DeleteAccountModal from "../components/modal/DeleteAccountModal"; import DeletePlaybackModal from "../components/modal/DeletePlaybackModal"; import DeleteAudioModal from "../components/modal/DeleteAudioModal"; import PlaylistModal from "../components/modal/PlaylistModal"; +import CommentsModal from "../components/modal/CommentsModal"; registerSheet("Delete", DeleteModal); registerSheet("ProfileSettings", ProfileSettingsModal); @@ -12,5 +13,6 @@ registerSheet("DeleteAccount", DeleteAccountModal); registerSheet("DeletePlayback", DeletePlaybackModal); registerSheet("DeleteAudio", DeleteAudioModal); registerSheet("Playlist", PlaylistModal); +registerSheet("Comments", CommentsModal); export {};