diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..d05d5b1
Binary files /dev/null and b/.DS_Store differ
diff --git a/addbannerlogicc.drawio b/addbannerlogicc.drawio
new file mode 100644
index 0000000..993f446
--- /dev/null
+++ b/addbannerlogicc.drawio
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/adminpanellogic.drawio b/adminpanellogic.drawio
new file mode 100644
index 0000000..b4a740b
--- /dev/null
+++ b/adminpanellogic.drawio
@@ -0,0 +1,115 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/controllers/messageController.js b/backend/controllers/messageController.js
index a8d0656..3aeee51 100644
--- a/backend/controllers/messageController.js
+++ b/backend/controllers/messageController.js
@@ -3,100 +3,165 @@ import Message from "../models/messageModel.js";
import { getRecipientSocketId, io } from "../socket/socket.js";
import { v2 as cloudinary } from "cloudinary";
+// this is is just a comment to see if anything is actually being affected and if im pushing changes as a head master thats all
+// Start of sendMessage function
async function sendMessage(req, res) {
- try {
- const { recipientId, message } = req.body;
- let { img } = req.body;
- const senderId = req.user._id;
-
- let conversation = await Conversation.findOne({
- participants: { $all: [senderId, recipientId] },
- });
-
- if (!conversation) {
- conversation = new Conversation({
- participants: [senderId, recipientId],
- lastMessage: {
- text: message,
- sender: senderId,
- },
- });
- await conversation.save();
- }
-
- if (img) {
- const uploadedResponse = await cloudinary.uploader.upload(img);
- img = uploadedResponse.secure_url;
- }
-
- const newMessage = new Message({
- conversationId: conversation._id,
- sender: senderId,
- text: message,
- img: img || "",
- });
-
- await Promise.all([
- newMessage.save(),
- conversation.updateOne({
- lastMessage: {
- text: message,
- sender: senderId,
- },
- }),
- ]);
-
- const recipientSocketId = getRecipientSocketId(recipientId);
- if (recipientSocketId) {
- io.to(recipientSocketId).emit("newMessage", newMessage);
- }
-
- res.status(201).json(newMessage);
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ try {
+ const { recipientId, message } = req.body;
+ let { img } = req.body;
+ const senderId = req.user._id;
+
+
+ let conversation = await Conversation.findOne({
+ participants: { $all: [senderId, recipientId] },
+ });
+
+
+ if (!conversation) {
+ conversation = new Conversation({
+ participants: [senderId, recipientId],
+ lastMessage: {
+ text: message,
+ sender: senderId,
+ },
+ });
+ await conversation.save();
+ }
+
+
+ if (img) {
+ const uploadedResponse = await cloudinary.uploader.upload(img);
+ img = uploadedResponse.secure_url;
+ }
+
+
+ const newMessage = new Message({
+ conversationId: conversation._id,
+ sender: senderId,
+ text: message,
+ img: img || "",
+ });
+
+
+ await Promise.all([
+ newMessage.save(),
+ conversation.updateOne({
+ lastMessage: {
+ text: message,
+ sender: senderId,
+ },
+ }),
+ ]);
+
+
+ const recipientSocketId = getRecipientSocketId(recipientId);
+ if (recipientSocketId) {
+ io.to(recipientSocketId).emit("newMessage", newMessage);
+ }
+
+
+ res.status(201).json(newMessage);
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
}
+// End of sendMessage function
+
+// Start of getMessages function
async function getMessages(req, res) {
- const { otherUserId } = req.params;
- const userId = req.user._id;
- try {
- const conversation = await Conversation.findOne({
- participants: { $all: [userId, otherUserId] },
- });
-
- if (!conversation) {
- return res.status(404).json({ error: "Conversation not found" });
- }
-
- const messages = await Message.find({
- conversationId: conversation._id,
- }).sort({ createdAt: 1 });
-
- res.status(200).json(messages);
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ const { otherUserId } = req.params;
+ const userId = req.user._id;
+ try {
+ const conversation = await Conversation.findOne({
+ participants: { $all: [userId, otherUserId] },
+ });
+
+
+ if (!conversation) {
+ return res.status(404).json({ error: "Conversation not found" });
+ }
+
+
+ const messages = await Message.find({
+ conversationId: conversation._id,
+ }).sort({ createdAt: 1 });
+
+
+ res.status(200).json(messages);
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
}
+// End of getMessages function
+
+// Start of getConversations function
async function getConversations(req, res) {
- const userId = req.user._id;
- try {
- const conversations = await Conversation.find({ participants: userId }).populate({
- path: "participants",
- select: "username profilePic",
- });
-
- // remove the current user from the participants array
- conversations.forEach((conversation) => {
- conversation.participants = conversation.participants.filter(
- (participant) => participant._id.toString() !== userId.toString()
- );
- });
- res.status(200).json(conversations);
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ const userId = req.user._id;
+ try {
+ const conversations = await Conversation.find({ participants: userId }).populate({
+ path: "participants",
+ select: "username profilePic",
+ });
+
+
+ // remove the current user from the participants array
+ conversations.forEach((conversation) => {
+ conversation.participants = conversation.participants.filter(
+ (participant) => participant._id.toString() !== userId.toString()
+ );
+ });
+ res.status(200).json(conversations);
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
}
+// End of getConversations function
+
+
+// Start of deleteMessage function
+async function deleteMessage(req, res) {
+ try {
+ const { messageId } = req.params;
+ const userId = req.user._id;
+
+
+ const message = await Message.findById(messageId);
+
+
+ // Check if the message exists and if the user is the sender
+ if (!message || message.sender.toString() !== userId.toString()) {
+ return res.status(403).json({ error: "You can only delete your own messages" });
+ }
+
+
+ // Delete the message
+ await message.deleteOne();
+
+
+ // Optionally, you can update the conversation's last message if the deleted message was the last one
+ const conversation = await Conversation.findById(message.conversationId);
+ if (conversation && conversation.lastMessage && conversation.lastMessage.text === message.text) {
+ const lastMessage = await Message.findOne({ conversationId: message.conversationId }).sort({ createdAt: -1 });
+ if (lastMessage) {
+ conversation.lastMessage = {
+ text: lastMessage.text,
+ sender: lastMessage.sender,
+ };
+ } else {
+ conversation.lastMessage = { text: "", sender: "" };
+ }
+ await conversation.save();
+ }
+
+
+ res.status(200).json({ message: "Message deleted successfully" });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
+}
+// End of deleteMessage function
+
-export { sendMessage, getMessages, getConversations };
+export { sendMessage, getMessages, getConversations, deleteMessage };
diff --git a/backend/controllers/postController.js b/backend/controllers/postController.js
index 3f964a4..1fa111e 100644
--- a/backend/controllers/postController.js
+++ b/backend/controllers/postController.js
@@ -1,171 +1,1815 @@
+// this is th euodated post controller with the the new changes(dont use this)
+// import Post from "../models/postModel.js";
+// import User from "../models/userModel.js";
+// import { v2 as cloudinary } from "cloudinary";
+
+// const createPost = async (req, res) => {
+// try {
+// const { text, targetAudience } = req.body;
+// let { img } = req.body;
+// const userId = req.user._id;
+
+// if (!text) {
+// return res.status(400).json({ error: "Text field is required" });
+// }
+
+// // Ensure text length is within limit (500 characters max)
+// if (text.length > 500) {
+// return res.status(400).json({ error: "Text must be less than 500 characters" });
+// }
+
+// // Find the user who is creating the post
+// const user = await User.findById(userId);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Handle image upload if provided
+// if (img) {
+// const uploadedResponse = await cloudinary.uploader.upload(img);
+// img = uploadedResponse.secure_url;
+// }
+
+// // Check target audience permissions based on user role
+// let finalTargetAudience = null;
+// if (user.role === "admin") {
+// // Admin can set any target audience
+// finalTargetAudience = targetAudience;
+// } else if (user.role === "teacher") {
+// // Teachers can target "all" or their own department
+// finalTargetAudience = targetAudience === "all" || targetAudience === user.department ? targetAudience : "all";
+// } else if (user.role === "student") {
+// // Students cannot specify a target audience
+// finalTargetAudience = null;
+// }
+
+// // Create a new post
+// const newPost = new Post({
+// postedBy: userId,
+// text,
+// img,
+// targetAudience: finalTargetAudience,
+// });
+
+// // Save the post
+// await newPost.save();
+// res.status(201).json(newPost);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+// const post = await Post.findById(postId).populate("postedBy", "username profilePic");
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// res.status(200).json(post);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const deletePost = async (req, res) => {
+// try {
+// const post = await Post.findById(req.params.id);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// if (post.postedBy.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to delete post" });
+// }
+
+// if (post.img) {
+// const imgId = post.img.split("/").pop().split(".")[0];
+// await cloudinary.uploader.destroy(imgId);
+// }
+
+// await Post.findByIdAndDelete(req.params.id);
+// res.status(200).json({ message: "Post deleted successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const likeUnlikePost = async (req, res) => {
+// try {
+// const { id: postId } = req.params;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const userLikedPost = post.likes.includes(userId);
+// if (userLikedPost) {
+// await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
+// res.status(200).json({ message: "Post unliked successfully" });
+// } else {
+// post.likes.push(userId);
+// await post.save();
+// res.status(200).json({ message: "Post liked successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const replyToPost = async (req, res) => {
+// try {
+// const { text } = req.body;
+// const postId = req.params.id;
+// const userId = req.user._id;
+// const userProfilePic = req.user.profilePic;
+// const username = req.user.username;
+
+// if (!text) {
+// return res.status(400).json({ error: "Text field is required" });
+// }
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const reply = { userId, text, userProfilePic, username };
+// post.replies.push(reply);
+// await post.save();
+
+// res.status(200).json(reply);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const repostPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// if (post.reposts.includes(userId)) {
+// return res.status(400).json({ error: "Post already reposted" });
+// }
+
+// post.reposts.push(userId);
+// await post.save();
+// res.status(200).json({ message: "Post reposted successfully", post });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getFeedPosts = async (req, res) => {
+// try {
+// const userId = req.user && req.user._id;
+// if (!userId) {
+// return res.status(401).json({ error: "Unauthorized, user not authenticated" });
+// }
+
+// const user = await User.findById(userId).select("role following yearGroup department isStudent");
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const following = user.following || [];
+// const allUserIds = [...following, userId];
+
+// let queryConditions = [
+// { targetAudience: null },
+// { targetAudience: "all" },
+// { postedBy: { $in: allUserIds } },
+// ];
+
+// if (user.role === "student") {
+// queryConditions.push({ targetAudience: user.yearGroup });
+// } else if (user.role === "teacher") {
+// queryConditions.push({ targetAudience: user.department });
+// }
+
+// const feedPosts = await Post.find({
+// $or: queryConditions,
+// }).sort({ createdAt: -1 });
+
+// res.status(200).json(feedPosts);
+// } catch (err) {
+// res.status(500).json({ error: "Could not fetch posts" });
+// }
+// };
+
+// const getUserPosts = async (req, res) => {
+// const { username } = req.params;
+// try {
+// const user = await User.findOne({ username });
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const posts = await Post.find({ postedBy: user._id }).sort({ createdAt: -1 });
+// res.status(200).json(posts);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export {
+// createPost,
+// getPost,
+// deletePost,
+// likeUnlikePost,
+// replyToPost,
+// repostPost,
+// getFeedPosts,
+// getUserPosts,
+// };
+
+// original use this version (working this si the one to use)
+// import Post from "../models/postModel.js";
+// import User from "../models/userModel.js";
+// import { v2 as cloudinary } from "cloudinary";
+
+// const createPost = async (req, res) => {
+// try {
+// const { postedBy, text, targetAudience } = req.body;
+// let { img } = req.body;
+
+// if (!postedBy || !text) {
+// return res.status(400).json({ error: "PostedBy and text fields are required" });
+// }
+
+// // Find the user who is posting
+// const user = await User.findById(postedBy);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Check if the user is authorized to post
+// if (user._id.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to create post" });
+// }
+
+// // Ensure text length is within limit (500 characters max)
+// if (text.length > 500) {
+// return res.status(400).json({ error: `Text must be less than 500 characters` });
+// }
+
+// // Handle image upload if provided
+// if (img) {
+// const uploadedResponse = await cloudinary.uploader.upload(img);
+// img = uploadedResponse.secure_url;
+// }
+
+// // Only teachers can set the `targetAudience`
+// let finalTargetAudience = null;
+// if (user.role === "teacher") {
+// finalTargetAudience = targetAudience || 'all'; // Default to 'all' if not specified
+// }
+
+// // Create the new post
+// const newPost = new Post({
+// postedBy,
+// text,
+// img,
+// targetAudience: finalTargetAudience, // Target audience only for teachers
+// });
+
+// // Save the post
+// await newPost.save();
+
+// // Respond with the newly created post
+// res.status(201).json(newPost);
+
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+
+// // Fetch the post with the postedBy details
+// const post = await Post.findById(postId).populate("postedBy", "username profilePic");
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// // Return the post since the middleware has already filtered access
+// res.status(200).json(post);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const deletePost = async (req, res) => {
+// try {
+// const post = await Post.findById(req.params.id);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// if (post.postedBy.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to delete post" });
+// }
+
+// if (post.img) {
+// const imgId = post.img.split("/").pop().split(".")[0];
+// await cloudinary.uploader.destroy(imgId);
+// }
+
+// await Post.findByIdAndDelete(req.params.id);
+
+// res.status(200).json({ message: "Post deleted successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const likeUnlikePost = async (req, res) => {
+// try {
+// const { id: postId } = req.params;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const userLikedPost = post.likes.includes(userId);
+
+// if (userLikedPost) {
+// // Unlike post
+// await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
+// res.status(200).json({ message: "Post unliked successfully" });
+// } else {
+// // Like post
+// post.likes.push(userId);
+// await post.save();
+// res.status(200).json({ message: "Post liked successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const replyToPost = async (req, res) => {
+// try {
+// const { text } = req.body;
+// const postId = req.params.id;
+// const userId = req.user._id;
+// const userProfilePic = req.user.profilePic;
+// const username = req.user.username;
+
+// if (!text) {
+// return res.status(400).json({ error: "Text field is required" });
+// }
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const reply = { userId, text, userProfilePic, username };
+
+// post.replies.push(reply);
+// await post.save();
+
+// res.status(200).json(reply);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// // New repostPost method
+// const repostPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// // Ensure the post is not already reposted by this user
+// if (post.reposts.includes(userId)) {
+// return res.status(400).json({ error: "Post already reposted" });
+// }
+
+// // Add user ID to reposts array
+// post.reposts.push(userId);
+// await post.save();
+
+// res.status(200).json({ message: "Post reposted successfully", post });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getFeedPosts = async (req, res) => {
+// try {
+// const userId = req.user && req.user._id; // Ensure req.user exists before accessing userId
+
+// if (!userId) {
+// return res.status(401).json({ error: "Unauthorized, user not authenticated" });
+// }
+
+// const user = await User.findById(userId).select("role following yearGroup isStudent");
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Retrieve the list of users the current user is following
+// const following = user.following || [];
+
+// // Include the current user’s own ID in the list to fetch their posts as well
+// const allUserIds = [...following, userId];
+
+// // Fetch posts based on target audience and user roles
+// const feedPosts = await Post.find({
+// $or: [
+// { targetAudience: null }, // Posts without specific targeting (public)
+// { targetAudience: "all" }, // Posts targeted to all users
+// { targetAudience: user.isStudent ? user.yearGroup : user.role }, // Posts targeted to user's year group or role
+// { postedBy: { $in: allUserIds } }, // Posts by users the current user is following
+// ],
+// }).sort({ createdAt: -1 });
+
+// // If no posts found, return an empty array instead of 404
+// if (!feedPosts.length) {
+// return res.status(200).json([]);
+// }
+
+// res.status(200).json(feedPosts);
+// } catch (err) {
+// console.error("Error fetching feed posts:", err.message);
+// res.status(500).json({ error: "Could not fetch posts" });
+// }
+// };
+
+// const getUserPosts = async (req, res) => {
+// const { username } = req.params;
+// try {
+// const user = await User.findOne({ username });
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const posts = await Post.find({ postedBy: user._id }).sort({
+// createdAt: -1,
+// });
+
+// res.status(200).json(posts);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export {
+// createPost,
+// getPost,
+// deletePost,
+// likeUnlikePost,
+// replyToPost,
+// getFeedPosts,
+// getUserPosts,
+// };
+
+// this is the new version Admin role update
+// import Post from "../models/postModel.js";
+// import User from "../models/userModel.js";
+// import { v2 as cloudinary } from "cloudinary";
+
+// const createPost = async (req, res) => {
+// try {
+// const {
+// postedBy,
+// text,
+// targetYearGroups,
+// targetDepartments,
+// targetAudience,
+// } = req.body;
+// let { img } = req.body;
+
+// // Validate required fields
+// if (!postedBy || !text) {
+// return res
+// .status(400)
+// .json({ error: "PostedBy and text fields are required" });
+// }
+
+// // Find the user who is posting
+// const user = await User.findById(postedBy);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Authorization check
+// if (user._id.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to create post" });
+// }
+
+// // Role-specific post creation rules
+// switch (user.role) {
+// case "student":
+// // Students can only post to 'all'
+// req.body.targetAudience = "all";
+// req.body.targetYearGroups = [];
+// req.body.targetDepartments = [];
+// break;
+
+// case "teacher":
+// // Teachers must specify year groups
+// if (!targetYearGroups || targetYearGroups.length === 0) {
+// return res.status(400).json({
+// error: "Teachers must specify at least one year group to target",
+// });
+// }
+// // Ensure the teacher is targeting only year groups
+// req.body.targetDepartments = [];
+// req.body.targetAudience = targetYearGroups[0]; // Set first targeted year group as audience
+// break;
+
+// case "admin":
+// // Admins must specify a target
+// if (!targetAudience && !targetYearGroups && !targetDepartments) {
+// return res.status(400).json({
+// error:
+// "Admin must specify a target audience, year groups, or departments",
+// });
+// }
+// break;
+
+// default:
+// return res.status(403).json({ error: "Unauthorized to create posts" });
+// }
+
+// // Handle image upload if provided
+// if (img) {
+// const uploadedResponse = await cloudinary.uploader.upload(img);
+// img = uploadedResponse.secure_url;
+// }
+
+// // Create the post
+// const newPost = new Post({
+// postedBy,
+// text,
+// img,
+// targetYearGroups: targetYearGroups || [],
+// targetDepartments: targetDepartments || [],
+// targetAudience: req.body.targetAudience || "all",
+// });
+
+// await newPost.save();
+// res.status(201).json(newPost);
+// } catch (err) {
+// console.error("Error in createPost:", err.message);
+// res.status(500).json({ error: "Failed to create post" });
+// }
+// };
+
+
+// const getPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+
+// // Fetch the post matching the filter and ID
+// const post = await Post.findOne({ _id: postId, ...req.filter }).populate(
+// "postedBy",
+// "username profilePic"
+// );
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found or access denied" });
+// }
+
+// res.status(200).json(post);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const deletePost = async (req, res) => {
+// try {
+// const post = await Post.findById(req.params.id);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// if (post.postedBy.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to delete post" });
+// }
+
+// if (post.img) {
+// const imgId = post.img.split("/").pop().split(".")[0];
+// await cloudinary.uploader.destroy(imgId);
+// }
+
+// await Post.findByIdAndDelete(req.params.id);
+
+// res.status(200).json({ message: "Post deleted successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const likeUnlikePost = async (req, res) => {
+// try {
+// const { id: postId } = req.params;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const userLikedPost = post.likes.includes(userId);
+
+// if (userLikedPost) {
+// // Unlike post
+// await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
+// res.status(200).json({ message: "Post unliked successfully" });
+// } else {
+// // Like post
+// post.likes.push(userId);
+// await post.save();
+// res.status(200).json({ message: "Post liked successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const replyToPost = async (req, res) => {
+// try {
+// const { text } = req.body;
+// const postId = req.params.id;
+// const userId = req.user._id;
+// const userProfilePic = req.user.profilePic;
+// const username = req.user.username;
+
+// if (!text) {
+// return res.status(400).json({ error: "Text field is required" });
+// }
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const reply = { userId, text, userProfilePic, username };
+
+// post.replies.push(reply);
+// await post.save();
+
+// res.status(200).json(reply);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// // New repostPost method
+// const repostPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// // Ensure the post is not already reposted by this user
+// if (post.reposts.includes(userId)) {
+// return res.status(400).json({ error: "Post already reposted" });
+// }
+
+// // Add user ID to reposts array
+// post.reposts.push(userId);
+// await post.save();
+
+// res.status(200).json({ message: "Post reposted successfully", post });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getFeedPosts = async (req, res) => {
+// try {
+// const userId = req.user && req.user._id;
+
+// if (!userId) {
+// return res
+// .status(401)
+// .json({ error: "Unauthorized, user not authenticated" });
+// }
+
+// const user = await User.findById(userId).select(
+// "role following yearGroup department isStudent"
+// );
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Retrieve the list of users the current user is following
+// const following = user.following || [];
+
+// // Construct a precise filtering condition
+// const postFilter = {
+// $or: [
+// // Always allow posts targeted to 'all'
+// { targetAudience: "all" },
+
+// // For students, show posts targeting their EXACT year group
+// ...(user.role === "student"
+// ? [
+// { targetYearGroups: { $in: [user.yearGroup] } },
+// { targetAudience: user.yearGroup },
+// ]
+// : []),
+
+// // For teachers, show posts targeting their EXACT department
+// ...(user.role === "teacher"
+// ? [
+// { targetDepartments: { $in: [user.department] } },
+// { targetAudience: user.department },
+// ]
+// : []),
+
+// // For admin/TV, show additional posts
+// ...(user.role === "admin" || user.role === "tv"
+// ? [{ targetAudience: "tv" }]
+// : []),
+
+// // Always show posts from users the current user is following
+// { postedBy: { $in: following } },
+
+// // Ensure users see their own posts
+// { postedBy: userId }
+// ],
+// };
+
+// // Fetch posts matching the filter
+// const feedPosts = await Post.find(postFilter)
+// .populate("postedBy", "username profilePic")
+// .sort({ createdAt: -1 })
+// .limit(50); // Limit to prevent overwhelming results
+
+// res.status(200).json(feedPosts);
+// } catch (err) {
+// console.error("Error fetching feed posts:", err.message);
+// res.status(500).json({ error: "Could not fetch posts" });
+// }
+// };
+
+// const getUserPosts = async (req, res) => {
+// const { username } = req.params;
+// try {
+// const user = await User.findOne({ username });
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const posts = await Post.find({ postedBy: user._id }).sort({
+// createdAt: -1,
+// });
+
+// res.status(200).json(posts);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export {
+// createPost,
+// getPost,
+// deletePost,
+// likeUnlikePost,
+// replyToPost,
+// getFeedPosts,
+// getUserPosts,
+// };
+
+
+// post notis(working)
+// import Post from "../models/postModel.js";
+// import User from "../models/userModel.js";
+// import { v2 as cloudinary } from "cloudinary";
+// import nodemailer from 'nodemailer';
+
+// // Email configuration
+// const transporter = nodemailer.createTransport({
+// host: "smtp-relay.brevo.com",
+// port: 587,
+// auth: {
+// user: "81d810001@smtp-brevo.com",
+// pass: "6IBdE9hsKrHUxD4G",
+// },
+// });
+
+// // Helper function to send notification email
+// const sendNotificationEmail = async (recipientEmail, posterId, postId, posterUsername) => {
+// const mailOptions = {
+// from: "pearnet104@gmail.com",
+// to: recipientEmail,
+// subject: "New Post on Pear! 🍐",
+// html: `
+//
+//
New Post on Pear! 🍐
+//
Hello! ${posterUsername} just made a new post on Pear.
+//
Don't miss out on the conversation!
+//
+// View Post
+//
+//
+// You received this email because you have notifications enabled.
+// You can disable these in your Pear account settings.
+//
+//
+// `
+// };
+
+// try {
+// await transporter.sendMail(mailOptions);
+// console.log(`Notification email sent to ${recipientEmail}`);
+// } catch (error) {
+// console.error(`Error sending notification email to ${recipientEmail}:`, error);
+// }
+// };
+
+// const createPost = async (req, res) => {
+// try {
+// const {
+// postedBy,
+// text,
+// targetYearGroups,
+// targetDepartments,
+// targetAudience,
+// } = req.body;
+// let { img } = req.body;
+
+// // Validate required fields
+// if (!postedBy || !text) {
+// return res
+// .status(400)
+// .json({ error: "PostedBy and text fields are required" });
+// }
+
+// // Find the user who is posting
+// const user = await User.findById(postedBy);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Authorization check
+// if (user._id.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to create post" });
+// }
+
+// // Role-specific post creation rules
+// switch (user.role) {
+// case "student":
+// // Students can only post to 'all'
+// req.body.targetAudience = "all";
+// req.body.targetYearGroups = [];
+// req.body.targetDepartments = [];
+// break;
+
+// case "teacher":
+// // Teachers must specify year groups
+// if (!targetYearGroups || targetYearGroups.length === 0) {
+// return res.status(400).json({
+// error: "Teachers must specify at least one year group to target",
+// });
+// }
+// // Ensure the teacher is targeting only year groups
+// req.body.targetDepartments = [];
+// req.body.targetAudience = targetYearGroups[0]; // Set first targeted year group as audience
+// break;
+
+// case "admin":
+// // Admins must specify a target
+// if (!targetAudience && !targetYearGroups && !targetDepartments) {
+// return res.status(400).json({
+// error:
+// "Admin must specify a target audience, year groups, or departments",
+// });
+// }
+// break;
+
+// default:
+// return res.status(403).json({ error: "Unauthorized to create posts" });
+// }
+
+// // Handle image upload if provided
+// if (img) {
+// const uploadedResponse = await cloudinary.uploader.upload(img);
+// img = uploadedResponse.secure_url;
+// }
+
+// // Create the post
+// const newPost = new Post({
+// postedBy,
+// text,
+// img,
+// targetYearGroups: targetYearGroups || [],
+// targetDepartments: targetDepartments || [],
+// targetAudience: req.body.targetAudience || "all",
+// });
+
+// await newPost.save();
+
+// // After successfully creating the post, send notifications
+// try {
+// // Find all users who have notifications enabled
+// const usersToNotify = await User.find({
+// notificationPreferences: true,
+// _id: { $ne: postedBy } // Exclude the post creator
+// });
+
+// // Send notifications in parallel
+// const notificationPromises = usersToNotify.map(recipient =>
+// sendNotificationEmail(
+// recipient.email,
+// postedBy,
+// newPost._id,
+// user.username
+// )
+// );
+
+// // Use Promise.allSettled to handle all notification attempts
+// await Promise.allSettled(notificationPromises);
+
+// } catch (notificationError) {
+// // Log notification errors but don't fail the post creation
+// console.error("Error sending notifications:", notificationError);
+// }
+
+// res.status(201).json(newPost);
+// } catch (err) {
+// console.error("Error in createPost:", err.message);
+// res.status(500).json({ error: "Failed to create post" });
+// }
+// };
+
+// const toggleNotifications = async (req, res) => {
+// try {
+// const userId = req.user._id;
+// const user = await User.findById(userId);
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Toggle the notification preferences
+// user.notificationPreferences = !user.notificationPreferences;
+// await user.save();
+
+// res.status(200).json({
+// message: `Notifications ${user.notificationPreferences ? 'enabled' : 'disabled'}`,
+// notificationPreferences: user.notificationPreferences
+// });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const getPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+
+// // Fetch the post matching the filter and ID
+// const post = await Post.findOne({ _id: postId, ...req.filter }).populate(
+// "postedBy",
+// "username profilePic"
+// );
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found or access denied" });
+// }
+
+// res.status(200).json(post);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const deletePost = async (req, res) => {
+// try {
+// const post = await Post.findById(req.params.id);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// if (post.postedBy.toString() !== req.user._id.toString()) {
+// return res.status(401).json({ error: "Unauthorized to delete post" });
+// }
+
+// if (post.img) {
+// const imgId = post.img.split("/").pop().split(".")[0];
+// await cloudinary.uploader.destroy(imgId);
+// }
+
+// await Post.findByIdAndDelete(req.params.id);
+
+// res.status(200).json({ message: "Post deleted successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const likeUnlikePost = async (req, res) => {
+// try {
+// const { id: postId } = req.params;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const userLikedPost = post.likes.includes(userId);
+
+// if (userLikedPost) {
+// // Unlike post
+// await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
+// res.status(200).json({ message: "Post unliked successfully" });
+// } else {
+// // Like post
+// post.likes.push(userId);
+// await post.save();
+// res.status(200).json({ message: "Post liked successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// const replyToPost = async (req, res) => {
+// try {
+// const { text } = req.body;
+// const postId = req.params.id;
+// const userId = req.user._id;
+// const userProfilePic = req.user.profilePic;
+// const username = req.user.username;
+
+// if (!text) {
+// return res.status(400).json({ error: "Text field is required" });
+// }
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// const reply = { userId, text, userProfilePic, username };
+
+// post.replies.push(reply);
+// await post.save();
+
+// res.status(200).json(reply);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+
+// // New repostPost method
+// const repostPost = async (req, res) => {
+// try {
+// const postId = req.params.id;
+// const userId = req.user._id;
+
+// const post = await Post.findById(postId);
+// if (!post) {
+// return res.status(404).json({ error: "Post not found" });
+// }
+
+// // Ensure the post is not already reposted by this user
+// if (post.reposts.includes(userId)) {
+// return res.status(400).json({ error: "Post already reposted" });
+// }
+
+// // Add user ID to reposts array
+// post.reposts.push(userId);
+// await post.save();
+
+// res.status(200).json({ message: "Post reposted successfully", post });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// }
+// };
+// original
+// const getFeedPosts = async (req, res) => {
+// try {
+// const userId = req.user && req.user._id;
+
+// if (!userId) {
+// return res
+// .status(401)
+// .json({ error: "Unauthorized, user not authenticated" });
+// }
+
+// const user = await User.findById(userId).select(
+// "role following yearGroup department isStudent"
+// );
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Retrieve the list of users the current user is following
+// const following = user.following || [];
+
+// // Construct a precise filtering condition
+// const postFilter = {
+// $or: [
+// // Always allow posts targeted to 'all'
+// { targetAudience: "all" },
+
+// // For students, show posts targeting their EXACT year group
+// ...(user.role === "student"
+// ? [
+// { targetYearGroups: { $in: [user.yearGroup] } },
+// { targetAudience: user.yearGroup },
+// ]
+// : []),
+
+// // For teachers, show posts targeting their EXACT department
+// ...(user.role === "teacher"
+// ? [
+// { targetDepartments: { $in: [user.department] } },
+// { targetAudience: user.department },
+// ]
+// : []),
+
+// // For admin/TV, show additional posts
+// ...(user.role === "admin" || user.role === "tv"
+// ? [{ targetAudience: "tv" }]
+// : []),
+
+// // Always show posts from users the current user is following
+// { postedBy: { $in: following } },
+
+// // Ensure users see their own posts
+// { postedBy: userId }
+// ],
+// };
+
+// // Fetch posts matching the filter
+// const feedPosts = await Post.find(postFilter)
+// .populate("postedBy", "username profilePic")
+// .sort({ createdAt: -1 })
+// .limit(50); // Limit to prevent overwhelming results
+
+// res.status(200).json(feedPosts);
+// } catch (err) {
+// console.error("Error fetching feed posts:", err.message);
+// res.status(500).json({ error: "Could not fetch posts" });
+// }
+// };
+
+// const getUserPosts = async (req, res) => {
+// const { username } = req.params;
+// try {
+// const user = await User.findOne({ username });
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const posts = await Post.find({ postedBy: user._id }).sort({
+// createdAt: -1,
+// });
+
+// res.status(200).json(posts);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export {
+// createPost,
+// toggleNotifications,
+// getPost,
+// deletePost,
+// likeUnlikePost,
+// replyToPost,
+// getFeedPosts,
+// getUserPosts,
+// };
+
+// post review
import Post from "../models/postModel.js";
import User from "../models/userModel.js";
import { v2 as cloudinary } from "cloudinary";
+import nodemailer from 'nodemailer';
+
+// Email configuration
+const transporter = nodemailer.createTransport({
+ host: "smtp-relay.brevo.com",
+ port: 587,
+ auth: {
+ user: "81d810001@smtp-brevo.com",
+ pass: "6IBdE9hsKrHUxD4G",
+ },
+});
+
+// Helper function to send notification email
+const sendNotificationEmail = async (recipientEmail, posterId, postId, posterUsername) => {
+ const mailOptions = {
+ from: "pearnet104@gmail.com",
+ to: recipientEmail,
+ subject: "New Post on Pear! 🍐",
+ html: `
+
+
New Post on Pear! 🍐
+
Hello! ${posterUsername} just made a new post on Pear.
+
Don't miss out on the conversation!
+
+ View Post
+
+
+ You received this email because you have notifications enabled.
+ You can disable these in your Pear account settings.
+
+
+ `
+ };
+
+ try {
+ await transporter.sendMail(mailOptions);
+ console.log(`Notification email sent to ${recipientEmail}`);
+ } catch (error) {
+ console.error(`Error sending notification email to ${recipientEmail}:`, error);
+ }
+};
const createPost = async (req, res) => {
- try {
- const { postedBy, text } = req.body;
- let { img } = req.body;
-
- if (!postedBy || !text) {
- return res.status(400).json({ error: "Postedby and text fields are required" });
- }
-
- const user = await User.findById(postedBy);
- if (!user) {
- return res.status(404).json({ error: "User not found" });
- }
-
- if (user._id.toString() !== req.user._id.toString()) {
- return res.status(401).json({ error: "Unauthorized to create post" });
- }
-
- const maxLength = 500;
- if (text.length > maxLength) {
- return res.status(400).json({ error: `Text must be less than ${maxLength} characters` });
- }
-
- if (img) {
- const uploadedResponse = await cloudinary.uploader.upload(img);
- img = uploadedResponse.secure_url;
- }
-
- const newPost = new Post({ postedBy, text, img });
- await newPost.save();
-
- res.status(201).json(newPost);
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log(err);
- }
+ try {
+ const {
+ postedBy,
+ text,
+ targetYearGroups,
+ targetDepartments,
+ targetAudience,
+ } = req.body;
+
+ let { img } = req.body;
+
+ // Validate required fields
+ if (!postedBy || !text) {
+ return res
+ .status(400)
+ .json({ error: 'PostedBy and text fields are required' });
+ }
+
+ // Find the user who is posting
+ const user = await User.findById(postedBy);
+ if (!user) {
+ return res.status(404).json({ error: 'User not found' });
+ }
+
+ // Authorization check
+ if (user._id.toString() !== req.user._id.toString()) {
+ return res.status(401).json({ error: 'Unauthorized to create post' });
+ }
+
+ // Role-specific post creation rules
+ switch (user.role) {
+ case 'student':
+ req.body.targetAudience = 'all';
+ req.body.targetYearGroups = [];
+ req.body.targetDepartments = [];
+ break;
+
+ case 'teacher':
+ if (!targetYearGroups || targetYearGroups.length === 0) {
+ return res.status(400).json({
+ error: 'Teachers must specify at least one year group to target',
+ });
+ }
+ req.body.targetDepartments = [];
+ req.body.targetAudience = targetYearGroups[0];
+ break;
+
+ case 'admin':
+ if (!targetAudience && !targetYearGroups && !targetDepartments) {
+ return res.status(400).json({
+ error: 'Admin must specify a target audience, year groups, or departments',
+ });
+ }
+ break;
+
+ default:
+ return res.status(403).json({ error: 'Unauthorized to create posts' });
+ }
+
+ // Handle image upload if provided
+ if (img) {
+ const uploadedResponse = await cloudinary.uploader.upload(img);
+ img = uploadedResponse.secure_url;
+ }
+
+ // Fetch admins and create post with reviewers if it's a student post
+ const adminUsers = await User.find({ role: 'admin' }); // Fetch admins first
+ const reviewers = user.role === 'student' ? adminUsers.map(admin => ({
+ userId: admin._id,
+ role: 'admin',
+ decision: 'pending'
+ })) : [];
+
+ const newPost = new Post({
+ postedBy,
+ text,
+ img,
+ targetYearGroups: targetYearGroups || [],
+ targetDepartments: targetDepartments || [],
+ reviewStatus: user.role === 'student' ? 'pending' : 'approved',
+ targetAudience: req.body.targetAudience || 'all',
+ reviewers
+ });
+
+ await newPost.save();
+
+ // Send notifications for non-student posts or approved student posts
+ if (user.role !== 'student' || newPost.reviewStatus === 'approved') {
+ try {
+ const usersToNotify = await User.find({
+ notificationPreferences: true,
+ _id: { $ne: postedBy },
+ });
+
+ const notificationPromises = usersToNotify.map((recipient) =>
+ sendNotificationEmail(
+ recipient.email,
+ postedBy,
+ newPost._id,
+ user.username
+ )
+ );
+
+ await Promise.allSettled(notificationPromises);
+ } catch (notificationError) {
+ console.error('Error sending notifications:', notificationError);
+ }
+ }
+
+ res.status(201).json(newPost);
+ } catch (err) {
+ console.error('Error in createPost:', err);
+ res.status(500).json({ error: err.message || 'Failed to create post' });
+ }
};
-const getPost = async (req, res) => {
- try {
- const post = await Post.findById(req.params.id);
- if (!post) {
- return res.status(404).json({ error: "Post not found" });
- }
+const getPendingReviews = async (req, res) => {
+ try {
+ if (!req.user) {
+ return res.status(401).json({ error: "User not authenticated" });
+ }
+
+ // Simplified query to just look for pending posts
+ const pendingReviews = await Post.find({
+ reviewStatus: 'pending'
+ }).populate('postedBy', 'username profilePic email');
+
+ console.log("Found pending reviews:", pendingReviews);
- res.status(200).json(post);
- } catch (err) {
- res.status(500).json({ error: err.message });
- }
+ res.status(200).json(pendingReviews);
+ } catch (err) {
+ console.error("Error in getPendingReviews:", err);
+ res.status(500).json({
+ error: "Error fetching pending reviews",
+ details: err.message
+ });
+ }
};
+// New function to handle post reviews
+const reviewPost = async (req, res) => {
+ try {
+ // Add debugging logs
+ console.log("Review request received:", {
+ user: req.user,
+ params: req.params,
+ body: req.body
+ });
-const deletePost = async (req, res) => {
- try {
- const post = await Post.findById(req.params.id);
- if (!post) {
- return res.status(404).json({ error: "Post not found" });
- }
-
- if (post.postedBy.toString() !== req.user._id.toString()) {
- return res.status(401).json({ error: "Unauthorized to delete post" });
- }
-
- if (post.img) {
- const imgId = post.img.split("/").pop().split(".")[0];
- await cloudinary.uploader.destroy(imgId);
- }
-
- await Post.findByIdAndDelete(req.params.id);
-
- res.status(200).json({ message: "Post deleted successfully" });
- } catch (err) {
- res.status(500).json({ error: err.message });
- }
+ // Check if user is authenticated
+ if (!req.user) {
+ console.log("Authentication failed: No user in request");
+ return res.status(401).json({ error: "User not authenticated" });
+ }
+
+ // Check if user is authorized to review (admin or teacher)
+ if (req.user.role !== 'admin' && req.user.role !== 'teacher') {
+ console.log("Authorization failed: User role is", req.user.role);
+ return res.status(401).json({ error: "Not authorized to review posts" });
+ }
+
+ const { postId } = req.params;
+ const { decision } = req.body;
+ const reviewerId = req.user._id;
+
+ console.log("Looking for post:", postId);
+ const post = await Post.findById(postId);
+
+ if (!post) {
+ console.log("Post not found:", postId);
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ console.log("Found post:", post);
+ console.log("Looking for reviewer:", reviewerId);
+
+ // Find the reviewer's entry
+ const reviewerIndex = post.reviewers.findIndex(
+ r => r.userId.toString() === reviewerId.toString()
+ );
+
+ console.log("Reviewer index:", reviewerIndex);
+
+ if (reviewerIndex === -1) {
+ console.log("Reviewer not found in post.reviewers");
+ return res.status(401).json({ error: "Not authorized to review this post" });
+ }
+
+ // Update reviewer's decision
+ post.reviewers[reviewerIndex].decision = decision;
+ post.reviewers[reviewerIndex].reviewedAt = new Date();
+
+ // Check review status
+ if (decision === 'approved') {
+ // Check if any admin or teacher has approved
+ const hasApproval = post.reviewers.some(
+ r => (r.role === 'admin' || r.role === 'teacher') && r.decision === 'approved'
+ );
+
+ if (hasApproval) {
+ post.reviewStatus = 'approved';
+ console.log("Post approved");
+
+ // Send notifications now that post is approved
+ try {
+ const poster = await User.findById(post.postedBy);
+ const usersToNotify = await User.find({
+ notificationPreferences: true,
+ _id: { $ne: post.postedBy },
+ });
+
+ const notificationPromises = usersToNotify.map((recipient) =>
+ sendNotificationEmail(
+ recipient.email,
+ post.postedBy,
+ post._id,
+ poster.username
+ )
+ );
+
+ await Promise.allSettled(notificationPromises);
+ } catch (error) {
+ console.error("Error sending notifications:", error);
+ }
+ }
+ } else if (decision === 'rejected') {
+ // If any admin or teacher rejects, post is rejected
+ const hasRejection = post.reviewers.some(
+ r => (r.role === 'admin' || r.role === 'teacher') && r.decision === 'rejected'
+ );
+
+ if (hasRejection) {
+ post.reviewStatus = 'rejected';
+ console.log("Post rejected");
+ }
+ }
+
+ await post.save();
+ console.log("Post saved successfully");
+ res.status(200).json(post);
+ } catch (err) {
+ console.error("Error in reviewPost:", err);
+ res.status(500).json({ error: err.message });
+ }
+};
+
+const toggleNotifications = async (req, res) => {
+ try {
+ const userId = req.user._id;
+ const user = await User.findById(userId);
+
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Toggle the notification preferences
+ user.notificationPreferences = !user.notificationPreferences;
+ await user.save();
+
+ res.status(200).json({
+ message: `Notifications ${user.notificationPreferences ? 'enabled' : 'disabled'}`,
+ notificationPreferences: user.notificationPreferences
+ });
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
+};
+
+const getPost = async (req, res) => {
+ try {
+ const postId = req.params.id;
+
+ const post = await Post.findById(postId).populate(
+ "postedBy",
+ "username profilePic"
+ );
+
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ // Convert to plain object and ensure likes and reposts arrays exist
+ const postObject = post.toObject();
+
+ // Initialize arrays if they don't exist
+ postObject.likes = postObject.likes || [];
+ postObject.reposts = postObject.reposts || [];
+
+ // Only check includes if user exists
+ if (req.user) {
+ postObject.isLiked = postObject.likes.includes(req.user._id.toString());
+ postObject.isReposted = postObject.reposts.includes(req.user._id.toString());
+ }
+
+ res.status(200).json(postObject);
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
};
+const deletePost = async (req, res) => {
+ try {
+ const post = await Post.findById(req.params.id);
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ // Allow deletion if user is post creator OR admin
+ if (
+ post.postedBy.toString() !== req.user._id.toString() &&
+ req.user.role !== "admin"
+ ) {
+ return res.status(401).json({ error: "Unauthorized to delete post" });
+ }
+
+ if (post.img) {
+ const imgId = post.img.split("/").pop().split(".")[0];
+ await cloudinary.uploader.destroy(imgId);
+ }
+ await Post.findByIdAndDelete(req.params.id);
+
+ res.status(200).json({ message: "Post deleted successfully" });
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
+};
const likeUnlikePost = async (req, res) => {
- try {
- const { id: postId } = req.params;
- const userId = req.user._id;
-
- const post = await Post.findById(postId);
-
- if (!post) {
- return res.status(404).json({ error: "Post not found" });
- }
-
- const userLikedPost = post.likes.includes(userId);
-
- if (userLikedPost) {
- // Unlike post
- await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
- res.status(200).json({ message: "Post unliked successfully" });
- } else {
- // Like post
- post.likes.push(userId);
- await post.save();
- res.status(200).json({ message: "Post liked successfully" });
- }
- } catch (err) {
- res.status(500).json({ error: err.message });
- }
+ try {
+ const { id: postId } = req.params;
+ const userId = req.user._id;
+
+ const post = await Post.findById(postId);
+
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ const userLikedPost = post.likes.includes(userId);
+
+ if (userLikedPost) {
+ // Unlike post
+ await Post.updateOne({ _id: postId }, { $pull: { likes: userId } });
+ res.status(200).json({ message: "Post unliked successfully" });
+ } else {
+ // Like post
+ post.likes.push(userId);
+ await post.save();
+ res.status(200).json({ message: "Post liked successfully" });
+ }
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
};
const replyToPost = async (req, res) => {
- try {
- const { text } = req.body;
- const postId = req.params.id;
- const userId = req.user._id;
- const userProfilePic = req.user.profilePic;
- const username = req.user.username;
-
- if (!text) {
- return res.status(400).json({ error: "Text field is required" });
- }
-
- const post = await Post.findById(postId);
- if (!post) {
- return res.status(404).json({ error: "Post not found" });
- }
-
- const reply = { userId, text, userProfilePic, username };
-
- post.replies.push(reply);
- await post.save();
-
- res.status(200).json(reply);
- } catch (err) {
- res.status(500).json({ error: err.message });
- }
+ try {
+ const { text } = req.body;
+ const postId = req.params.id;
+ const userId = req.user._id;
+ const userProfilePic = req.user.profilePic;
+ const username = req.user.username;
+
+ if (!text) {
+ return res.status(400).json({ error: "Text field is required" });
+ }
+
+ const post = await Post.findById(postId);
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ const reply = { userId, text, userProfilePic, username };
+
+ post.replies.push(reply);
+ await post.save();
+
+ res.status(200).json(reply);
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
};
-const getFeedPosts = async (req, res) => {
- try {
- const userId = req.user._id;
- const user = await User.findById(userId);
- if (!user) {
- return res.status(404).json({ error: "User not found" });
- }
+// New repostPost method
+const repostPost = async (req, res) => {
+ try {
+ const postId = req.params.id;
+ const userId = req.user._id;
+
+ const post = await Post.findById(postId);
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
- const following = user.following;
+ // Ensure the post is not already reposted by this user
+ if (post.reposts.includes(userId)) {
+ return res.status(400).json({ error: "Post already reposted" });
+ }
- const feedPosts = await Post.find({ postedBy: { $in: following } }).sort({ createdAt: -1 });
+ // Add user ID to reposts array
+ post.reposts.push(userId);
+ await post.save();
- res.status(200).json(feedPosts);
- } catch (err) {
- res.status(500).json({ error: err.message });
- }
+ res.status(200).json({ message: "Post reposted successfully", post });
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
};
+// new code
+const getFeedPosts = async (req, res) => {
+ try {
+ const userId = req.user && req.user._id;
+
+ if (!userId) {
+ return res.status(401).json({ error: "Unauthorized, user not authenticated" });
+ }
+
+ const user = await User.findById(userId).select("role following yearGroup department");
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Base filter conditions that apply to all posts
+ const baseFilter = {
+ $or: [
+ { postedBy: userId }, // User's own posts
+ { postedBy: { $in: user.following || [] } }, // Posts from followed users
+ ]
+ };
+
+ // Audience-specific filter based on user role
+ let audienceFilter = {
+ $or: [
+ { targetAudience: "all" }, // Posts targeted to everyone
+ ]
+ };
+
+ // Add role-specific filters
+ if (user.role === "student" && user.yearGroup) {
+ audienceFilter.$or.push(
+ { targetYearGroups: user.yearGroup },
+ { targetAudience: user.yearGroup }
+ );
+ }
+ else if (user.role === "teacher" && user.department) {
+ audienceFilter.$or.push(
+ { targetDepartments: user.department },
+ { targetAudience: user.department }
+ );
+ }
+ else if (user.role === "admin" || user.role === "tv") {
+ // Admins and TV can see all posts
+ audienceFilter = {}; // No additional filtering needed
+ }
+
+ // Combine with approval status filter
+ const approvalFilter = {
+ $or: [
+ { postedBy: { $in: await User.find({ role: { $ne: "student" } }).distinct('_id') } }, // Non-student posts
+ { $and: [ // Student posts must be approved
+ { postedBy: { $in: await User.find({ role: "student" }).distinct('_id') } },
+ { reviewStatus: "approved" }
+ ]}
+ ]
+ };
+
+ // Combine all filters
+ const finalFilter = {
+ $and: [
+ baseFilter,
+ audienceFilter,
+ approvalFilter
+ ]
+ };
+
+ const feedPosts = await Post.find(finalFilter)
+ .populate("postedBy", "username profilePic")
+ .sort({ createdAt: -1 })
+ .limit(50);
+ res.status(200).json(feedPosts);
+ } catch (err) {
+ console.error("Error fetching feed posts:", err.message);
+ res.status(500).json({ error: "Could not fetch posts" });
+ }
+};
const getUserPosts = async (req, res) => {
- const { username } = req.params;
- try {
- const user = await User.findOne({ username });
- if (!user) {
- return res.status(404).json({ error: "User not found" });
- }
-
- const posts = await Post.find({ postedBy: user._id }).sort({ createdAt: -1 });
-
- res.status(200).json(posts);
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ const { username } = req.params;
+ try {
+ const user = await User.findOne({ username });
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ const posts = await Post.find({ postedBy: user._id })
+ .populate("postedBy", "username profilePic")
+ .sort({
+ createdAt: -1,
+ });
+
+ res.status(200).json(posts);
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
};
-export { createPost, getPost, deletePost, likeUnlikePost, replyToPost, getFeedPosts, getUserPosts };
+const deleteComment = async (req, res) => {
+ try {
+ const { commentId } = req.params;
+
+ // Find the post containing the comment
+ const post = await Post.findOne({ "replies._id": commentId });
+ if (!post) {
+ return res.status(404).json({ error: "Post not found" });
+ }
+
+ // Find the comment
+ const comment = post.replies.id(commentId);
+ if (!comment) {
+ return res.status(404).json({ error: "Comment not found" });
+ }
+
+ // Authorization check
+ if (req.user.role !== "admin" && comment.userId.toString() !== req.user._id.toString()) {
+ return res.status(403).json({ error: "Unauthorized to delete comment" });
+ }
+
+ // Remove the comment from the array
+ post.replies.pull(commentId);
+ await post.save();
+
+ res.status(200).json({ message: "Comment deleted successfully" });
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ }
+};
+export {
+ createPost,
+ deleteComment,
+ getPendingReviews,
+ reviewPost,
+ toggleNotifications,
+ getPost,
+ deletePost,
+ likeUnlikePost,
+ replyToPost,
+ getFeedPosts,
+ getUserPosts,
+};
\ No newline at end of file
diff --git a/backend/controllers/userController.js b/backend/controllers/userController.js
index 8b1c398..f1962f2 100644
--- a/backend/controllers/userController.js
+++ b/backend/controllers/userController.js
@@ -1,251 +1,2076 @@
+// this is the orginal version
+// import User from "../models/userModel.js";
+// import Post from "../models/postModel.js";
+// import bcrypt from "bcryptjs";
+// import generateTokenAndSetCookie from "../utils/helpers/generateTokenAndSetCookie.js";
+// import { v2 as cloudinary } from "cloudinary";
+// import mongoose from "mongoose";
+
+// const getUserProfile = async (req, res) => {
+// // We will fetch user profile either with username or userId
+// // query is either username or userId
+// const { query } = req.params;
+
+// try {
+// let user;
+
+// // query is userId
+// if (mongoose.Types.ObjectId.isValid(query)) {
+// user = await User.findOne({ _id: query }).select("-password").select("-updatedAt");
+// } else {
+// // query is username
+// user = await User.findOne({ username: query }).select("-password").select("-updatedAt");
+// }
+
+// if (!user) return res.status(404).json({ error: "User not found" });
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in getUserProfile: ", err.message);
+// }
+// };
+
+// const signupUser = async (req, res) => {
+// try {
+// const { name, email, username, password } = req.body;
+// const user = await User.findOne({ $or: [{ email }, { username }] });
+
+// if (user) {
+// return res.status(400).json({ error: "User already exists" });
+// }
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+
+// const newUser = new User({
+// name,
+// email,
+// username,
+// password: hashedPassword,
+// });
+// await newUser.save();
+
+// if (newUser) {
+// generateTokenAndSetCookie(newUser._id, res);
+
+// res.status(201).json({
+// _id: newUser._id,
+// name: newUser.name,
+// email: newUser.email,
+// username: newUser.username,
+// bio: newUser.bio,
+// profilePic: newUser.profilePic,
+// });
+// } else {
+// res.status(400).json({ error: "Invalid user data" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in signupUser: ", err.message);
+// }
+// };
+
+// const loginUser = async (req, res) => {
+// try {
+// const { username, password } = req.body;
+// const user = await User.findOne({ username });
+// const isPasswordCorrect = await bcrypt.compare(password, user?.password || "");
+
+// if (!user || !isPasswordCorrect) {
+// return res.status(400).json({ error: "Invalid username or password" });
+// }
+
+// if (user.isFrozen) {
+// user.isFrozen = false;
+// await user.save();
+// }
+
+// // Start of auto-follow everyone code
+// const allUsers = await User.find({});
+// const allUserIds = allUsers.map(u => u._id.toString());
+// user.following = allUserIds;
+// await user.save();
+// // End of auto-follow everyone code
+
+// // Send back the role to the front-end so it knows whether the user is a teacher or student
+// generateTokenAndSetCookie(user._id, res);
+
+// res.status(200).json({
+// _id: user._id,
+// name: user.name,
+// email: user.email,
+// username: user.username,
+// bio: user.bio,
+// profilePic: user.profilePic,
+// role: user.role, // Include the role in the response
+// message: "Login successful, now following all users including yourself."
+// });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in loginUser: ", error.message);
+// }
+// };
+
+// const logoutUser = (req, res) => {
+// try {
+// res.cookie("jwt", "", { maxAge: 1 });
+// res.status(200).json({ message: "User logged out successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in logoutUser: ", err.message);
+// }
+// };
+
+// const followUnFollowUser = async (req, res) => {
+// try {
+// const { id } = req.params;
+// const userToModify = await User.findById(id);
+// const currentUser = await User.findById(req.user._id);
+
+// if (id === req.user._id.toString())
+// return res.status(400).json({ error: "You cannot follow/unfollow yourself" });
+
+// if (!userToModify || !currentUser) return res.status(400).json({ error: "User not found" });
+
+// const isFollowing = currentUser.following.includes(id);
+
+// if (isFollowing) {
+// // Unfollow user
+// await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
+// res.status(200).json({ message: "User unfollowed successfully" });
+// } else {
+// // Follow user
+// await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
+// res.status(200).json({ message: "User followed successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in followUnFollowUser: ", err.message);
+// }
+// };
+
+// const updateUser = async (req, res) => {
+// const { name, email, username, password, bio } = req.body;
+// let { profilePic } = req.body;
+
+// const userId = req.user._id;
+// try {
+// let user = await User.findById(userId);
+// if (!user) return res.status(400).json({ error: "User not found" });
+
+// if (req.params.id !== userId.toString())
+// return res.status(400).json({ error: "You cannot update other user's profile" });
+
+// if (password) {
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+// user.password = hashedPassword;
+// }
+
+// if (profilePic) {
+// if (user.profilePic) {
+// await cloudinary.uploader.destroy(user.profilePic.split("/").pop().split(".")[0]);
+// }
+
+// const uploadedResponse = await cloudinary.uploader.upload(profilePic);
+// profilePic = uploadedResponse.secure_url;
+// }
+
+// user.name = name || user.name;
+// user.email = email || user.email;
+// user.username = username || user.username;
+// user.profilePic = profilePic || user.profilePic;
+// user.bio = bio || user.bio;
+
+// user = await user.save();
+
+// // Find all posts that this user replied and update username and userProfilePic fields
+// await Post.updateMany(
+// { "replies.userId": userId },
+// {
+// $set: {
+// "replies.$[reply].username": user.username,
+// "replies.$[reply].userProfilePic": user.profilePic,
+// },
+// },
+// { arrayFilters: [{ "reply.userId": userId }] }
+// );
+
+// // password should be null in response
+// user.password = null;
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in updateUser: ", err.message);
+// }
+// };
+
+// // Start of integration code
+// const getSuggestedUsers = async (req, res) => {
+// try {
+// // exclude the current user from suggested users array and exclude users that current user is already following
+// const userId = req.user._id;
+
+// const usersFollowedByYou = await User.findById(userId).select("following");
+
+// const users = await User.aggregate([
+// {
+// $match: {
+// _id: { $ne: userId },
+// },
+// },
+// {
+// $sample: { size: 10 },
+// },
+// ]);
+// const filteredUsers = users.filter((user) => !usersFollowedByYou.following.includes(user._id));
+// const suggestedUsers = filteredUsers.slice(0, 4);
+
+// suggestedUsers.forEach((user) => (user.password = null));
+
+// res.status(200).json(suggestedUsers);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// const freezeAccount = async (req, res) => {
+// try {
+// const user = await User.findById(req.user._id);
+// if (!user) {
+// return res.status(400).json({ error: "User not found" });
+// }
+
+// user.isFrozen = true;
+// await user.save();
+
+// res.status(200).json({ success: true });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// // New function for awarding verification
+// const awardVerification = async (req, res) => {
+// const { userId, verificationType } = req.body;
+
+// // Validate verification type
+// if (!['blue', 'gold'].includes(verificationType)) {
+// return res.status(400).json({ error: "Invalid verification type" });
+// }
+
+// try {
+// const user = await User.findById(userId);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Set the verification type
+// user.verification = verificationType;
+// await user.save();
+
+// res.status(200).json({ message: "Verification awarded", user });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in awardVerification: ", error.message);
+// }
+// };
+// // End of integration code
+
+// export {
+// signupUser,
+// loginUser,
+// logoutUser,
+// followUnFollowUser,
+// updateUser,
+// getUserProfile,
+// getSuggestedUsers,
+// freezeAccount,
+// awardVerification, // Exporting the new function
+// };
+
+// admin role update (working)firstversion
+// import User from "../models/userModel.js";
+// import Post from "../models/postModel.js";
+// import bcrypt from "bcryptjs";
+// import generateTokenAndSetCookie from "../utils/helpers/generateTokenAndSetCookie.js";
+// import { v2 as cloudinary } from "cloudinary";
+// import mongoose from "mongoose";
+
+// const getUserProfile = async (req, res) => {
+// // We will fetch user profile either with username or userId
+// // query is either username or userId
+// const { query } = req.params;
+
+// try {
+// let user;
+
+// // query is userId
+// if (mongoose.Types.ObjectId.isValid(query)) {
+// user = await User.findOne({ _id: query })
+// .select("-password")
+// .select("-updatedAt");
+// } else {
+// // query is username
+// user = await User.findOne({ username: query })
+// .select("-password")
+// .select("-updatedAt");
+// }
+
+// if (!user) return res.status(404).json({ error: "User not found" });
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in getUserProfile: ", err.message);
+// }
+// };
+
+// const signupUser = async (req, res) => {
+// try {
+// const { name, email, username, password, role, yearGroup, department } = req.body;
+
+// console.log("Signup request received:", req.body);
+
+// // Check if user already exists based on email or username
+// const existingUser = await User.findOne({ $or: [{ email }, { username }] });
+// if (existingUser) {
+// return res.status(400).json({ error: "User already exists" });
+// }
+
+// // Hash the password
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+
+// // Create the user with more flexible role handling
+// const newUser = new User({
+// name,
+// email,
+// username,
+// password: hashedPassword,
+// role,
+// // Only set yearGroup if role is student
+// ...(role === "student" ? { yearGroup } : {}),
+// // Only set department if role is teacher
+// ...(role === "teacher" ? { department } : {}),
+// });
+
+// // Save the user to the database
+// await newUser.save();
+
+// console.log("User created successfully:", newUser);
+
+// // Generate token and send response
+// generateTokenAndSetCookie(newUser._id, res);
+// res.status(201).json({
+// _id: newUser._id,
+// name: newUser.name,
+// email: newUser.email,
+// username: newUser.username,
+// role: newUser.role,
+// yearGroup: newUser.yearGroup,
+// department: newUser.department,
+// });
+// } catch (err) {
+// console.error("Detailed Error in signupUser:", {
+// message: err.message,
+// name: err.name,
+// errors: err.errors,
+// stack: err.stack
+// });
+// res.status(500).json({
+// error: "Failed to register user",
+// details: err.message,
+// validationErrors: err.errors
+// });
+// }
+// };
+// const loginUser = async (req, res) => {
+// try {
+// const { username, password } = req.body;
+// const user = await User.findOne({ username });
+// const isPasswordCorrect = await bcrypt.compare(
+// password,
+// user?.password || ""
+// );
+
+// if (!user || !isPasswordCorrect) {
+// return res.status(400).json({ error: "Invalid username or password" });
+// }
+
+// if (user.isFrozen) {
+// user.isFrozen = false;
+// await user.save();
+// }
+
+// // Start of auto-follow everyone code
+// const allUsers = await User.find({});
+// const allUserIds = allUsers.map((u) => u._id.toString());
+// user.following = allUserIds;
+// await user.save();
+// // End of auto-follow everyone code
+
+// // Send back the role to the front-end so it knows whether the user is a teacher or student
+// generateTokenAndSetCookie(user._id, res);
+
+// res.status(200).json({
+// _id: user._id,
+// name: user.name,
+// email: user.email,
+// username: user.username,
+// bio: user.bio,
+// profilePic: user.profilePic,
+// role: user.role, // Include the role in the response
+// message: "Login successful, now following all users including yourself.",
+// });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in loginUser: ", error.message);
+// }
+// };
+
+// const logoutUser = (req, res) => {
+// try {
+// res.cookie("jwt", "", { maxAge: 1 });
+// res.status(200).json({ message: "User logged out successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in logoutUser: ", err.message);
+// }
+// };
+
+// const followUnFollowUser = async (req, res) => {
+// try {
+// const { id } = req.params;
+// const userToModify = await User.findById(id);
+// const currentUser = await User.findById(req.user._id);
+
+// if (id === req.user._id.toString())
+// return res
+// .status(400)
+// .json({ error: "You cannot follow/unfollow yourself" });
+
+// if (!userToModify || !currentUser)
+// return res.status(400).json({ error: "User not found" });
+
+// const isFollowing = currentUser.following.includes(id);
+
+// if (isFollowing) {
+// // Unfollow user
+// await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
+// res.status(200).json({ message: "User unfollowed successfully" });
+// } else {
+// // Follow user
+// await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
+// res.status(200).json({ message: "User followed successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in followUnFollowUser: ", err.message);
+// }
+// };
+
+// const updateUser = async (req, res) => {
+// const { name, email, username, password, bio } = req.body;
+// let { profilePic } = req.body;
+
+// const userId = req.user._id;
+// try {
+// let user = await User.findById(userId);
+// if (!user) return res.status(400).json({ error: "User not found" });
+
+// if (req.params.id !== userId.toString())
+// return res
+// .status(400)
+// .json({ error: "You cannot update other user's profile" });
+
+// if (password) {
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+// user.password = hashedPassword;
+// }
+
+// if (profilePic) {
+// if (user.profilePic) {
+// await cloudinary.uploader.destroy(
+// user.profilePic.split("/").pop().split(".")[0]
+// );
+// }
+
+// const uploadedResponse = await cloudinary.uploader.upload(profilePic);
+// profilePic = uploadedResponse.secure_url;
+// }
+
+// user.name = name || user.name;
+// user.email = email || user.email;
+// user.username = username || user.username;
+// user.profilePic = profilePic || user.profilePic;
+// user.bio = bio || user.bio;
+
+// user = await user.save();
+
+// // Find all posts that this user replied and update username and userProfilePic fields
+// await Post.updateMany(
+// { "replies.userId": userId },
+// {
+// $set: {
+// "replies.$[reply].username": user.username,
+// "replies.$[reply].userProfilePic": user.profilePic,
+// },
+// },
+// { arrayFilters: [{ "reply.userId": userId }] }
+// );
+
+// // password should be null in response
+// user.password = null;
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in updateUser: ", err.message);
+// }
+// };
+
+// // Start of integration code
+// const getSuggestedUsers = async (req, res) => {
+// try {
+// // exclude the current user from suggested users array and exclude users that current user is already following
+// const userId = req.user._id;
+
+// const usersFollowedByYou = await User.findById(userId).select("following");
+
+// const users = await User.aggregate([
+// {
+// $match: {
+// _id: { $ne: userId },
+// },
+// },
+// {
+// $sample: { size: 10 },
+// },
+// ]);
+// const filteredUsers = users.filter(
+// (user) => !usersFollowedByYou.following.includes(user._id)
+// );
+// const suggestedUsers = filteredUsers.slice(0, 4);
+
+// suggestedUsers.forEach((user) => (user.password = null));
+
+// res.status(200).json(suggestedUsers);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// const freezeAccount = async (req, res) => {
+// try {
+// const user = await User.findById(req.user._id);
+// if (!user) {
+// return res.status(400).json({ error: "User not found" });
+// }
+
+// user.isFrozen = true;
+// await user.save();
+
+// res.status(200).json({ success: true });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// // New function for awarding verification
+// const awardVerification = async (req, res) => {
+// const { userId, verificationType } = req.body;
+
+// // Validate verification type
+// if (!["blue", "gold"].includes(verificationType)) {
+// return res.status(400).json({ error: "Invalid verification type" });
+// }
+
+// try {
+// const user = await User.findById(userId);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Set the verification type
+// user.verification = verificationType;
+// await user.save();
+
+// res.status(200).json({ message: "Verification awarded", user });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in awardVerification: ", error.message);
+// }
+// };
+// // End of integration code
+
+// export {
+// signupUser,
+// loginUser,
+// logoutUser,
+// followUnFollowUser,
+// updateUser,
+// getUserProfile,
+// getSuggestedUsers,
+// freezeAccount,
+// awardVerification, // Exporting the new function
+// };
+
+// email verification update(working)
+// import User from "../models/userModel.js";
+// import Post from "../models/postModel.js";
+// import bcrypt from "bcryptjs";
+// import crypto from "crypto";
+// import nodemailer from "nodemailer";
+// import generateTokenAndSetCookie from "../utils/helpers/generateTokenAndSetCookie.js";
+// import { v2 as cloudinary } from "cloudinary";
+// import Conversation from "../models/conversationModel.js";
+// import Message from "../models/messageModel.js";
+// import mongoose from "mongoose";
+// import TempUser from "../models/tempUserModel.js";
+
+// const getUserProfile = async (req, res) => {
+// // We will fetch user profile either with username or userId
+// // query is either username or userId
+// const { query } = req.params;
+
+// try {
+// let user;
+
+// // query is userId
+// if (mongoose.Types.ObjectId.isValid(query)) {
+// user = await User.findOne({ _id: query })
+// .select("-password")
+// .select("-updatedAt");
+// } else {
+// // query is username
+// user = await User.findOne({ username: query })
+// .select("-password")
+// .select("-updatedAt");
+// }
+
+// if (!user) return res.status(404).json({ error: "User not found" });
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in getUserProfile: ", err.message);
+// }
+// };
+
+// const transporter = nodemailer.createTransport({
+// host: "smtp-relay.brevo.com",
+// port: 587,
+// auth: {
+// user: "81d810001@smtp-brevo.com",
+// pass: "6IBdE9hsKrHUxD4G",
+// },
+// });
+
+
+// const generateOTP = () => {
+// return crypto.randomInt(1000, 10000);
+// };
+
+// const sendOTPEmail = async (email, otp) => {
+// const mailOptions = {
+// from: "pearnet104@gmail.com",
+// to: email,
+// subject: "Your OTP Code",
+// text: `Your OTP code is ${otp}. It will expire in 2 minutes.`,
+// };
+
+// console.log(`Sending OTP Email to ${email} with OTP ${otp}`);
+// await transporter.sendMail(mailOptions);
+// };
+
+// const MAX_OTP_ATTEMPTS = 3;
+// const OTP_COOLDOWN = 2 * 60 * 1000; // 2 minutes in milliseconds
+
+// const signupUser = async (req, res) => {
+// console.log("Signup request received:", req.body);
+
+// try {
+// const { name, email, username, password, role, yearGroup, department } = req.body;
+
+// // Check for banned email first
+// const bannedUser = await User.findOne({ email, isBanned: true });
+// if (bannedUser) {
+// return res.status(403).json({ error: "This email is permanently banned" });
+// }
+
+// // Check for existing user
+// const existingUser = await User.findOne({ $or: [{ email }, { username }] });
+// if (existingUser) {
+// return res.status(400).json({ error: "User already exists" });
+// }
+
+// // Check for existing temporary signup
+// const existingTemp = await TempUser.findOne({ email });
+// if (existingTemp) {
+// // Check cooldown period
+// const timeSinceLastOtp = Date.now() - existingTemp.lastOtpSent;
+// if (timeSinceLastOtp < OTP_COOLDOWN) {
+// const remainingTime = Math.ceil((OTP_COOLDOWN - timeSinceLastOtp) / 1000);
+// return res.status(429).json({
+// error: `Please wait ${remainingTime} seconds before requesting another OTP`
+// });
+// }
+// }
+
+// const otp = generateOTP();
+// const otpExpiry = new Date(Date.now() + OTP_COOLDOWN);
+
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+
+// // Store in temporary collection
+// const tempUser = new TempUser({
+// name,
+// email,
+// username,
+// password: hashedPassword,
+// role,
+// otp,
+// otpExpiry,
+// ...(role === "student" ? { yearGroup } : {}),
+// ...(role === "teacher" ? { department } : {}),
+// });
+
+// await tempUser.save();
+// await sendOTPEmail(email, otp);
+
+// res.status(200).json({
+// message: "OTP sent to email. Please verify within 2 minutes.",
+// email: email
+// });
+
+// } catch (err) {
+// console.error("Error in signupUser:", err.message);
+// res.status(500).json({
+// error: "Failed to initiate signup",
+// details: err.message,
+// });
+// }
+// };
+
+// const verifyOTP = async (req, res) => {
+// try {
+// const { email, otp } = req.body;
+
+// if (!email || !otp) {
+// return res.status(400).json({ error: "Email and OTP are required" });
+// }
+
+// const tempUser = await TempUser.findOne({ email });
+
+// if (!tempUser) {
+// return res.status(404).json({ error: "No pending verification found" });
+// }
+
+// if (tempUser.otpAttempts >= MAX_OTP_ATTEMPTS) {
+// await TempUser.deleteOne({ email });
+// return res.status(429).json({
+// error: "Maximum OTP attempts exceeded. Please start signup process again."
+// });
+// }
+
+// const receivedOTP = parseInt(otp, 10);
+
+// if (tempUser.otp !== receivedOTP) {
+// tempUser.otpAttempts += 1;
+// await tempUser.save();
+// return res.status(400).json({
+// error: `Invalid OTP. ${MAX_OTP_ATTEMPTS - tempUser.otpAttempts} attempts remaining.`
+// });
+// }
+
+// if (Date.now() > tempUser.otpExpiry) {
+// return res.status(400).json({ error: "OTP expired" });
+// }
+
+// // Create actual user after successful verification
+// const newUser = new User({
+// name: tempUser.name,
+// email: tempUser.email,
+// username: tempUser.username,
+// password: tempUser.password,
+// role: tempUser.role,
+// isVerified: true,
+// yearGroup: tempUser.yearGroup,
+// department: tempUser.department
+// });
+
+// await newUser.save();
+// await TempUser.deleteOne({ email });
+
+// // Generate token and set cookie
+// generateTokenAndSetCookie(newUser._id, res);
+
+// res.status(200).json({
+// message: "User verified and created successfully",
+// _id: newUser._id,
+// name: newUser.name,
+// email: newUser.email,
+// username: newUser.username,
+// role: newUser.role,
+// yearGroup: newUser.yearGroup,
+// department: newUser.department,
+// isVerified: true,
+// });
+// } catch (err) {
+// console.error("Verify OTP error:", err.message || err);
+// res.status(500).json({ error: "Internal server error" });
+// }
+// };
+
+// const resendOTP = async (req, res) => {
+// try {
+// const { email } = req.body;
+
+// const tempUser = await TempUser.findOne({ email });
+// if (!tempUser) {
+// return res.status(404).json({ error: "No pending verification found" });
+// }
+
+// const timeSinceLastOtp = Date.now() - tempUser.lastOtpSent;
+// if (timeSinceLastOtp < OTP_COOLDOWN) {
+// const remainingTime = Math.ceil((OTP_COOLDOWN - timeSinceLastOtp) / 1000);
+// return res.status(429).json({
+// error: `Please wait ${remainingTime} seconds before requesting another OTP`
+// });
+// }
+
+// const newOtp = generateOTP();
+// tempUser.otp = newOtp;
+// tempUser.otpExpiry = new Date(Date.now() + OTP_COOLDOWN);
+// tempUser.lastOtpSent = new Date();
+// await tempUser.save();
+
+// await sendOTPEmail(email, newOtp);
+
+// res.status(200).json({
+// message: "New OTP sent successfully",
+// email: email
+// });
+// } catch (err) {
+// console.error("Resend OTP error:", err.message);
+// res.status(500).json({ error: "Failed to resend OTP" });
+// }
+// };
+
+
+// const loginUser = async (req, res) => {
+// try {
+// const { username, password } = req.body;
+
+// // First find the user by username
+// const user = await User.findOne({ username });
+
+// // Check credentials before checking ban status
+// const isPasswordCorrect = await bcrypt.compare(
+// password,
+// user?.password || ""
+// );
+
+// if (!user || !isPasswordCorrect) {
+// return res.status(400).json({ error: "Invalid username or password" });
+// }
+
+// // Now check if the user is banned
+// if (user.isBanned) {
+// return res.status(403).json({ error: "Account permanently banned" });
+// }
+
+// // Rest of the login logic remains the same
+// if (user.isFrozen) {
+// user.isFrozen = false;
+// await user.save();
+// }
+
+// // Auto-follow logic
+// const allUsers = await User.find({});
+// const allUserIds = allUsers.map((u) => u._id.toString());
+// user.following = allUserIds;
+// await user.save();
+
+// generateTokenAndSetCookie(user._id, res);
+
+// res.status(200).json({
+// _id: user._id,
+// name: user.name,
+// email: user.email,
+// username: user.username,
+// bio: user.bio,
+// profilePic: user.profilePic,
+// role: user.role,
+// message: "Login successful, now following all users including yourself.",
+// });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in loginUser: ", error.message);
+// }
+// };
+
+// const logoutUser = (req, res) => {
+// try {
+// res.cookie("jwt", "", { maxAge: 1 });
+// res.status(200).json({ message: "User logged out successfully" });
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in logoutUser: ", err.message);
+// }
+// };
+
+// const followUnFollowUser = async (req, res) => {
+// try {
+// const { id } = req.params;
+// const userToModify = await User.findById(id);
+// const currentUser = await User.findById(req.user._id);
+
+// if (id === req.user._id.toString())
+// return res
+// .status(400)
+// .json({ error: "You cannot follow/unfollow yourself" });
+
+// if (!userToModify || !currentUser)
+// return res.status(400).json({ error: "User not found" });
+
+// const isFollowing = currentUser.following.includes(id);
+
+// if (isFollowing) {
+// // Unfollow user
+// await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
+// res.status(200).json({ message: "User unfollowed successfully" });
+// } else {
+// // Follow user
+// await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
+// await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
+// res.status(200).json({ message: "User followed successfully" });
+// }
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in followUnFollowUser: ", err.message);
+// }
+// };
+
+// const updateUser = async (req, res) => {
+// const { name, email, username, password, bio } = req.body;
+// let { profilePic } = req.body;
+
+// const userId = req.user._id;
+// try {
+// let user = await User.findById(userId);
+// if (!user) return res.status(400).json({ error: "User not found" });
+
+// if (req.params.id !== userId.toString())
+// return res
+// .status(400)
+// .json({ error: "You cannot update other user's profile" });
+
+// if (password) {
+// const salt = await bcrypt.genSalt(10);
+// const hashedPassword = await bcrypt.hash(password, salt);
+// user.password = hashedPassword;
+// }
+
+// if (profilePic) {
+// if (user.profilePic) {
+// await cloudinary.uploader.destroy(
+// user.profilePic.split("/").pop().split(".")[0]
+// );
+// }
+
+// const uploadedResponse = await cloudinary.uploader.upload(profilePic);
+// profilePic = uploadedResponse.secure_url;
+// }
+
+// user.name = name || user.name;
+// user.email = email || user.email;
+// user.username = username || user.username;
+// user.profilePic = profilePic || user.profilePic;
+// user.bio = bio || user.bio;
+
+// user = await user.save();
+
+// // Find all posts that this user replied and update username and userProfilePic fields
+// await Post.updateMany(
+// { "replies.userId": userId },
+// {
+// $set: {
+// "replies.$[reply].username": user.username,
+// "replies.$[reply].userProfilePic": user.profilePic,
+// },
+// },
+// { arrayFilters: [{ "reply.userId": userId }] }
+// );
+
+// // password should be null in response
+// user.password = null;
+
+// res.status(200).json(user);
+// } catch (err) {
+// res.status(500).json({ error: err.message });
+// console.log("Error in updateUser: ", err.message);
+// }
+// };
+
+// // Start of integration code
+// const getSuggestedUsers = async (req, res) => {
+// try {
+// // exclude the current user from suggested users array and exclude users that current user is already following
+// const userId = req.user._id;
+
+// const usersFollowedByYou = await User.findById(userId).select("following");
+
+// const users = await User.aggregate([
+// {
+// $match: {
+// _id: { $ne: userId },
+// },
+// },
+// {
+// $sample: { size: 10 },
+// },
+// ]);
+// const filteredUsers = users.filter(
+// (user) => !usersFollowedByYou.following.includes(user._id)
+// );
+// const suggestedUsers = filteredUsers.slice(0, 4);
+
+// suggestedUsers.forEach((user) => (user.password = null));
+
+// res.status(200).json(suggestedUsers);
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// const freezeAccount = async (req, res) => {
+// try {
+// const user = await User.findById(req.user._id);
+// if (!user) {
+// return res.status(400).json({ error: "User not found" });
+// }
+
+// user.isFrozen = true;
+// await user.save();
+
+// res.status(200).json({ success: true });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// // New function for awarding verification
+// const awardVerification = async (req, res) => {
+// const { userId, verificationType } = req.body;
+
+// // Validate verification type
+// if (!["blue", "gold"].includes(verificationType)) {
+// return res.status(400).json({ error: "Invalid verification type" });
+// }
+
+// try {
+// const user = await User.findById(userId);
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// // Set the verification type
+// user.verification = verificationType;
+// await user.save();
+
+// res.status(200).json({ message: "Verification awarded", user });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// console.log("Error in awardVerification: ", error.message);
+// }
+// };
+// const adminFreezeUser = async (req, res) => {
+// try {
+// const { userId } = req.body;
+
+// if (userId === req.user._id.toString()) {
+// return res.status(400).json({ error: "Cannot perform action on yourself" });
+// }
+
+// const user = await User.findById(userId);
+// if (!user) return res.status(404).json({ error: "User not found" });
+
+// if (user.freezeCount >= 1) {
+// user.isBanned = true;
+// user.isFrozen = false;
+// await user.save();
+
+// // Send ban notification
+// try {
+// await transporter.sendMail({
+// from: "pearnet104@gmail.com",
+// to: user.email,
+// subject: "Account Banned",
+// text: "Your account has been banned. Unfortunately, until the foreseeable future, you will not be able to create an account with us again until further notice."
+// });
+// } catch (emailError) {
+// console.error("Failed to send ban notification:", emailError);
+// }
+
+// await deleteUserData(userId);
+// return res.json({ banned: true });
+// }
+
+// user.isFrozen = true;
+// user.freezeCount += 1;
+// user.freezeUntil = new Date(Date.now() + 14 * 86400000);
+// await user.save();
+
+// // Send freeze notification
+// try {
+// await transporter.sendMail({
+// from: "pearnet104@gmail.com",
+// to: user.email,
+// subject: "Account Frozen",
+// text: "You won't be able to access chat, commenting, and posting until you are unfrozen after 2 weeks."
+// });
+// } catch (emailError) {
+// console.error("Failed to send freeze notification:", emailError);
+// }
+
+// res.status(200).json({ success: true });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// const adminDeleteUser = async (req, res) => {
+// try {
+// const { userId } = req.body;
+
+// if (userId === req.user._id.toString()) {
+// return res.status(400).json({ error: "Cannot delete yourself" });
+// }
+
+// const user = await User.findById(userId);
+// if (!user) return res.status(404).json({ error: "User not found" });
+
+// // Send ban notification
+// try {
+// await transporter.sendMail({
+// from: "pearnet104@gmail.com",
+// to: user.email,
+// subject: "Account Banned",
+// text: "Your account has been banned. Unfortunately, until the foreseeable future, you will not be able to create an account with us again until further notice."
+// });
+// } catch (emailError) {
+// console.error("Failed to send ban notification:", emailError);
+// }
+
+// await deleteUserData(userId);
+// res.status(200).json({ success: true });
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// // Add this helper function (implement actual deletion logic)
+// // userController.js
+// const deleteUserData = async (userId) => {
+// try {
+// // 1. Delete user's posts and associated data
+// await Post.deleteMany({ user: userId });
+
+// // 2. Remove user's replies from all posts
+// await Post.updateMany(
+// { "replies.userId": userId },
+// { $pull: { replies: { userId: userId } } }
+// );
+
+// // 3. Handle conversations and messages
+// const userConversations = await Conversation.find({
+// participants: userId,
+// });
+
+// // Delete all messages in these conversations
+// await Message.deleteMany({
+// conversation: { $in: userConversations.map((c) => c._id) },
+// });
+
+// // Delete the conversations themselves
+// await Conversation.deleteMany({
+// participants: userId,
+// });
+
+// // 4. Remove user from social connections
+// await User.updateMany(
+// { $or: [{ followers: userId }, { following: userId }] },
+// { $pull: { followers: userId, following: userId } }
+// );
+
+// // 5. Remove user from chat participants lists
+// await Conversation.updateMany(
+// { participants: userId },
+// { $pull: { participants: userId } }
+// );
+
+// // 6. Delete profile picture from Cloudinary
+// const user = await User.findById(userId);
+// if (user?.profilePic) {
+// const publicId = user.profilePic.split("/").pop().split(".")[0];
+// await cloudinary.uploader.destroy(publicId);
+// }
+
+// // 7. Finally delete the user document
+// await User.findByIdAndDelete(userId);
+
+// console.log(`Successfully deleted all data for user ${userId}`);
+// } catch (error) {
+// console.error("Error deleting user data:", error);
+// throw error;
+// }
+// };
+// export {
+// signupUser,
+// verifyOTP,
+// resendOTP,
+// loginUser,
+// logoutUser,
+// followUnFollowUser,
+// updateUser,
+// getUserProfile,
+// getSuggestedUsers,
+// freezeAccount,
+// awardVerification,
+// adminFreezeUser,
+// adminDeleteUser,
+// deleteUserData, // Exporting the new function
+// };
+
+
+// this si the validation updatew
import User from "../models/userModel.js";
import Post from "../models/postModel.js";
import bcrypt from "bcryptjs";
+import crypto from "crypto";
+import nodemailer from "nodemailer";
import generateTokenAndSetCookie from "../utils/helpers/generateTokenAndSetCookie.js";
import { v2 as cloudinary } from "cloudinary";
+import Conversation from "../models/conversationModel.js";
+import Message from "../models/messageModel.js";
import mongoose from "mongoose";
+import TempUser from "../models/tempUserModel.js";
const getUserProfile = async (req, res) => {
- // We will fetch user profile either with username or userId
- // query is either username or userId
- const { query } = req.params;
+ // We will fetch user profile either with username or userId
+ // query is either username or userId
+ const { query } = req.params;
+
+ try {
+ let user;
+
+ // query is userId
+ if (mongoose.Types.ObjectId.isValid(query)) {
+ user = await User.findOne({ _id: query })
+ .select("-password")
+ .select("-updatedAt");
+ } else {
+ // query is username
+ user = await User.findOne({ username: query })
+ .select("-password")
+ .select("-updatedAt");
+ }
+
+ if (!user) return res.status(404).json({ error: "User not found" });
+
+ res.status(200).json(user);
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ console.log("Error in getUserProfile: ", err.message);
+ }
+};
+const validateEmail = (email) => {
+ if (!email) return { isValid: false, error: 'Email is required' };
+
+ const emailLower = email.toLowerCase();
+
+ // Check for admin exception (pear emails)
+ if (emailLower.includes('pear')) {
+ return {
+ isValid: true,
+ emailType: 'admin',
+ campus: null,
+ userIdentifier: 'pear' // Special case for admin accounts
+ };
+ }
+
+ // Check for Brookhouse domain
+ if (!emailLower.includes('brookhouse.ac.ke')) {
+ return {
+ isValid: false,
+ error: 'Please use your Brookhouse email address'
+ };
+ }
+
+ // Extract user identifier (everything before @)
+ const userIdentifier = emailLower.split('@')[0];
+
+ // Determine email type and campus
+ const isStudent = emailLower.includes('students');
+ const isRunda = emailLower.includes('runda');
+
+ return {
+ isValid: true,
+ emailType: isStudent ? 'student' : 'teacher',
+ campus: isRunda ? 'runda' : 'karen',
+ userIdentifier
+ };
+};
+const validateUsername = (username, email) => {
+ if (!username || !email) {
+ return { isValid: false, error: 'Username and email are required' };
+ }
+
+ const { isValid, emailType, userIdentifier } = validateEmail(email);
+
+ if (!isValid) {
+ return { isValid: false, error: 'Invalid email' };
+ }
+
+ // Special case for admin accounts
+ if (emailType === 'admin') {
+ if (!username.toLowerCase().includes('pear')) {
+ return {
+ isValid: false,
+ error: 'Admin usernames must contain "pear"'
+ };
+ }
+ return { isValid: true };
+ }
+
+ // For regular accounts, extract surname from email identifier
+ const surname = userIdentifier.slice(1); // Remove first letter to get surname
+
+ if (!username.toLowerCase().includes(surname.toLowerCase())) {
+ return {
+ isValid: false,
+ error: `Username must contain your surname (${surname})`
+ };
+ }
+
+ return { isValid: true };
+};
+
+// Role verification logic
+const verifyRoleMatch = (email, selectedRole) => {
+ const { isValid, emailType, error } = validateEmail(email);
+
+ if (!isValid) {
+ return { isValid: false, error };
+ }
+
+ // Verify role matches email type
+ if (emailType === 'student' && selectedRole === 'teacher') {
+ return {
+ isValid: false,
+ error: 'Student emails cannot select teacher roles'
+ };
+ }
+
+ if (emailType === 'teacher' && selectedRole === 'student') {
+ return {
+ isValid: false,
+ error: 'Teacher emails cannot select student roles'
+ };
+ }
+
+ return {
+ isValid: true,
+ emailType,
+ role: selectedRole
+ };
+};
+
+const transporter = nodemailer.createTransport({
+ host: "smtp-relay.brevo.com",
+ port: 587,
+ auth: {
+ user: "81d810001@smtp-brevo.com",
+ pass: "6IBdE9hsKrHUxD4G",
+ },
+});
- try {
- let user;
- // query is userId
- if (mongoose.Types.ObjectId.isValid(query)) {
- user = await User.findOne({ _id: query }).select("-password").select("-updatedAt");
- } else {
- // query is username
- user = await User.findOne({ username: query }).select("-password").select("-updatedAt");
- }
+const generateOTP = () => {
+ return crypto.randomInt(1000, 10000);
+};
- if (!user) return res.status(404).json({ error: "User not found" });
+const sendOTPEmail = async (email, otp) => {
+ const mailOptions = {
+ from: "pearnet104@gmail.com",
+ to: email,
+ subject: "Your OTP Code",
+ text: `Your OTP code is ${otp}. It will expire in 2 minutes.`,
+ };
- res.status(200).json(user);
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log("Error in getUserProfile: ", err.message);
- }
+ console.log(`Sending OTP Email to ${email} with OTP ${otp}`);
+ await transporter.sendMail(mailOptions);
};
+const MAX_OTP_ATTEMPTS = 3;
+const OTP_COOLDOWN = 3 * 60 * 1000; // 2 minutes in milliseconds
+
const signupUser = async (req, res) => {
- try {
- const { name, email, username, password } = req.body;
- const user = await User.findOne({ $or: [{ email }, { username }] });
-
- if (user) {
- return res.status(400).json({ error: "User already exists" });
- }
- const salt = await bcrypt.genSalt(10);
- const hashedPassword = await bcrypt.hash(password, salt);
-
- const newUser = new User({
- name,
- email,
- username,
- password: hashedPassword,
- });
- await newUser.save();
-
- if (newUser) {
- generateTokenAndSetCookie(newUser._id, res);
-
- res.status(201).json({
- _id: newUser._id,
- name: newUser.name,
- email: newUser.email,
- username: newUser.username,
- bio: newUser.bio,
- profilePic: newUser.profilePic,
- });
- } else {
- res.status(400).json({ error: "Invalid user data" });
- }
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log("Error in signupUser: ", err.message);
- }
+ console.log("Signup request received:", req.body);
+
+ try {
+ const { name, email, username, password, role, yearGroup, department } = req.body;
+
+ // Check for banned email first
+ const bannedUser = await User.findOne({ email, isBanned: true });
+ if (bannedUser) {
+ return res.status(403).json({ error: "This email is permanently banned" });
+ }
+
+ // Validate email format
+ const emailValidation = validateEmail(email);
+ if (!emailValidation.isValid) {
+ return res.status(400).json({ error: emailValidation.error });
+ }
+
+ // Validate username contains surname
+ const usernameValidation = validateUsername(username, email);
+ if (!usernameValidation.isValid) {
+ return res.status(400).json({ error: usernameValidation.error });
+ }
+
+ // Check for existing user
+ const existingUser = await User.findOne({ $or: [{ email }, { username }] });
+ if (existingUser) {
+ return res.status(400).json({ error: "User already exists" });
+ }
+
+ // Determine campus based on email
+ const emailLower = email.toLowerCase();
+ let campus = 'admin';
+ if (!emailLower.includes('pear')) {
+ campus = emailLower.includes('runda') ? 'runda' : 'karen';
+ }
+
+ // Check for existing temporary signup
+ const existingTemp = await TempUser.findOne({ email });
+ if (existingTemp) {
+ // Check cooldown period
+ const timeSinceLastOtp = Date.now() - existingTemp.lastOtpSent;
+ if (timeSinceLastOtp < OTP_COOLDOWN) {
+ const remainingTime = Math.ceil((OTP_COOLDOWN - timeSinceLastOtp) / 1000);
+ return res.status(429).json({
+ error: `Please wait ${remainingTime} seconds before requesting another OTP`
+ });
+ }
+ }
+
+ const otp = generateOTP();
+ const otpExpiry = new Date(Date.now() + OTP_COOLDOWN);
+
+ const salt = await bcrypt.genSalt(10);
+ const hashedPassword = await bcrypt.hash(password, salt);
+
+ // Store in temporary collection with campus
+ const tempUser = new TempUser({
+ name,
+ email,
+ username,
+ password: hashedPassword,
+ role,
+ campus,
+ otp,
+ otpExpiry,
+ ...(role === "student" ? { yearGroup } : {}),
+ ...(role === "teacher" ? { department } : {})
+ });
+
+ await tempUser.save();
+ await sendOTPEmail(email, otp);
+
+ res.status(200).json({
+ message: "OTP sent to email. Please verify within 2 minutes.",
+ email: email
+ });
+
+ } catch (err) {
+ console.error("Error in signupUser:", err.message);
+ res.status(500).json({
+ error: "Failed to initiate signup",
+ details: err.message,
+ });
+ }
+};
+
+// In verifyOTP endpoint (userController.js)
+const verifyOTP = async (req, res) => {
+ const { email, otp } = req.body;
+
+ try {
+ // Input validation
+ if (!email || !otp) {
+ return res.status(400).json({
+ error: "Email and OTP are required"
+ });
+ }
+
+ // Find temporary user record
+ const tempUser = await TempUser.findOne({ email: email.toLowerCase() });
+ if (!tempUser) {
+ console.log(`No temporary user found for email: ${email}`);
+ return res.status(404).json({
+ error: "No pending verification found. Please restart the signup process."
+ });
+ }
+
+ // Log verification attempt
+ console.log(`OTP Verification attempt for ${email}:`, {
+ receivedOTP: otp,
+ storedOTP: tempUser.otp,
+ attempts: tempUser.otpAttempts,
+ expiry: tempUser.otpExpiry,
+ currentTime: new Date()
+ });
+
+ // Check attempts
+ if (tempUser.otpAttempts >= 3) {
+ console.log(`Max attempts exceeded for ${email}`);
+ await TempUser.deleteOne({ email: email.toLowerCase() });
+ return res.status(429).json({
+ error: "Maximum attempts exceeded. Please restart the signup process."
+ });
+ }
+
+ // Validate OTP
+ if (!tempUser.isValidOtp(otp)) {
+ const remainingAttempts = 3 - (await tempUser.incrementAttempts());
+ console.log(`Invalid OTP for ${email}. ${remainingAttempts} attempts remaining`);
+
+ return res.status(400).json({
+ error: `Invalid OTP. ${remainingAttempts} attempts remaining.`
+ });
+ }
+
+ // Prepare user data for creation
+ const userData = {
+ name: tempUser.name,
+ email: tempUser.email,
+ username: tempUser.username,
+ password: tempUser.password,
+ role: tempUser.role,
+ campus: tempUser.campus, // Ensure campus is included
+ isVerified: true
+ };
+
+ // Add conditional fields based on role
+ if (tempUser.role === 'student') {
+ userData.yearGroup = tempUser.yearGroup;
+ } else if (tempUser.role === 'teacher') {
+ userData.department = tempUser.department;
+ }
+
+ try {
+ // Create new verified user
+ const newUser = new User(userData);
+ await newUser.save();
+
+ // Clean up temporary user data
+ await TempUser.deleteOne({ email: email.toLowerCase() });
+
+ // Generate authentication token
+ generateTokenAndSetCookie(newUser._id, res);
+
+ // Log successful verification
+ console.log(`Successfully verified and created user: ${email}`);
+
+ // Return success response
+ return res.status(200).json({
+ _id: newUser._id,
+ name: newUser.name,
+ email: newUser.email,
+ username: newUser.username,
+ role: newUser.role,
+ yearGroup: newUser.yearGroup,
+ department: newUser.department,
+ campus: newUser.campus,
+ isVerified: true
+ });
+
+ } catch (error) {
+ // Handle user creation errors
+ console.error(`Error creating verified user for ${email}:`, error);
+
+ // Clean up temp user on failure
+ await TempUser.deleteOne({ email: email.toLowerCase() });
+
+ // Check for duplicate key errors
+ if (error.code === 11000) {
+ return res.status(400).json({
+ error: "Username or email already exists. Please try again with different credentials."
+ });
+ }
+
+ throw error;
+ }
+
+ } catch (error) {
+ // Log the full error for debugging
+ console.error('OTP Verification Error:', {
+ email,
+ error: error.message,
+ stack: error.stack
+ });
+
+ // Return appropriate error response
+ return res.status(500).json({
+ error: "Internal server error during verification. Please try again.",
+ details: process.env.NODE_ENV === 'development' ? error.message : undefined
+ });
+ }
+};
+const resendOTP = async (req, res) => {
+ try {
+ const { email } = req.body;
+
+ if (!email) {
+ return res.status(400).json({ error: "Email is required" });
+ }
+
+ const tempUser = await TempUser.findOne({ email });
+ if (!tempUser) {
+ return res.status(404).json({
+ error: "No pending verification found. Please restart signup."
+ });
+ }
+
+ // Check cooldown period
+ const timeSinceLastOtp = Date.now() - tempUser.lastOtpSent;
+ if (timeSinceLastOtp < OTP_COOLDOWN) {
+ const remainingTime = Math.ceil((OTP_COOLDOWN - timeSinceLastOtp) / 1000);
+ return res.status(429).json({
+ error: `Please wait ${remainingTime} seconds before requesting another OTP`
+ });
+ }
+
+ // Generate and save new OTP
+ const newOtp = generateOTP();
+ tempUser.otp = newOtp;
+ tempUser.otpExpiry = new Date(Date.now() + OTP_COOLDOWN);
+ tempUser.lastOtpSent = new Date();
+ tempUser.otpAttempts = 0; // Reset attempts for new OTP
+ await tempUser.save();
+
+ // Send new OTP
+ await sendOTPEmail(email, newOtp);
+
+ res.status(200).json({
+ message: "New OTP sent successfully",
+ email: email,
+ expiryTime: tempUser.otpExpiry
+ });
+
+ } catch (err) {
+ console.error("Resend OTP error:", err.message);
+ res.status(500).json({
+ error: "Failed to resend OTP. Please try again."
+ });
+ }
};
const loginUser = async (req, res) => {
- try {
- const { username, password } = req.body;
- const user = await User.findOne({ username });
- const isPasswordCorrect = await bcrypt.compare(password, user?.password || "");
-
- if (!user || !isPasswordCorrect) return res.status(400).json({ error: "Invalid username or password" });
-
- if (user.isFrozen) {
- user.isFrozen = false;
- await user.save();
- }
-
- generateTokenAndSetCookie(user._id, res);
-
- res.status(200).json({
- _id: user._id,
- name: user.name,
- email: user.email,
- username: user.username,
- bio: user.bio,
- profilePic: user.profilePic,
- });
- } catch (error) {
- res.status(500).json({ error: error.message });
- console.log("Error in loginUser: ", error.message);
- }
+ try {
+ const { username, password } = req.body;
+
+ // First find the user by username
+ const user = await User.findOne({ username });
+
+ // Check credentials before checking ban status
+ const isPasswordCorrect = await bcrypt.compare(
+ password,
+ user?.password || ""
+ );
+
+ if (!user || !isPasswordCorrect) {
+ return res.status(400).json({ error: "Invalid username or password" });
+ }
+
+ // Now check if the user is banned
+ if (user.isBanned) {
+ return res.status(403).json({ error: "Account permanently banned" });
+ }
+
+ // Rest of the login logic remains the same
+ if (user.isFrozen) {
+ user.isFrozen = false;
+ await user.save();
+ }
+
+ // Auto-follow logic
+ const allUsers = await User.find({});
+ const allUserIds = allUsers.map((u) => u._id.toString());
+ user.following = allUserIds;
+ await user.save();
+
+ generateTokenAndSetCookie(user._id, res);
+
+ res.status(200).json({
+ _id: user._id,
+ name: user.name,
+ email: user.email,
+ username: user.username,
+ bio: user.bio,
+ profilePic: user.profilePic,
+ role: user.role,
+ message: "Login successful, now following all users including yourself.",
+ });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ console.log("Error in loginUser: ", error.message);
+ }
};
const logoutUser = (req, res) => {
- try {
- res.cookie("jwt", "", { maxAge: 1 });
- res.status(200).json({ message: "User logged out successfully" });
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log("Error in signupUser: ", err.message);
- }
+ try {
+ res.cookie("jwt", "", { maxAge: 1 });
+ res.status(200).json({ message: "User logged out successfully" });
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ console.log("Error in logoutUser: ", err.message);
+ }
};
const followUnFollowUser = async (req, res) => {
- try {
- const { id } = req.params;
- const userToModify = await User.findById(id);
- const currentUser = await User.findById(req.user._id);
-
- if (id === req.user._id.toString())
- return res.status(400).json({ error: "You cannot follow/unfollow yourself" });
-
- if (!userToModify || !currentUser) return res.status(400).json({ error: "User not found" });
-
- const isFollowing = currentUser.following.includes(id);
-
- if (isFollowing) {
- // Unfollow user
- await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
- await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
- res.status(200).json({ message: "User unfollowed successfully" });
- } else {
- // Follow user
- await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
- await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
- res.status(200).json({ message: "User followed successfully" });
- }
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log("Error in followUnFollowUser: ", err.message);
- }
+ try {
+ const { id } = req.params;
+ const userToModify = await User.findById(id);
+ const currentUser = await User.findById(req.user._id);
+
+ if (id === req.user._id.toString())
+ return res
+ .status(400)
+ .json({ error: "You cannot follow/unfollow yourself" });
+
+ if (!userToModify || !currentUser)
+ return res.status(400).json({ error: "User not found" });
+
+ const isFollowing = currentUser.following.includes(id);
+
+ if (isFollowing) {
+ // Unfollow user
+ await User.findByIdAndUpdate(id, { $pull: { followers: req.user._id } });
+ await User.findByIdAndUpdate(req.user._id, { $pull: { following: id } });
+ res.status(200).json({ message: "User unfollowed successfully" });
+ } else {
+ // Follow user
+ await User.findByIdAndUpdate(id, { $push: { followers: req.user._id } });
+ await User.findByIdAndUpdate(req.user._id, { $push: { following: id } });
+ res.status(200).json({ message: "User followed successfully" });
+ }
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ console.log("Error in followUnFollowUser: ", err.message);
+ }
};
const updateUser = async (req, res) => {
- const { name, email, username, password, bio } = req.body;
- let { profilePic } = req.body;
-
- const userId = req.user._id;
- try {
- let user = await User.findById(userId);
- if (!user) return res.status(400).json({ error: "User not found" });
-
- if (req.params.id !== userId.toString())
- return res.status(400).json({ error: "You cannot update other user's profile" });
-
- if (password) {
- const salt = await bcrypt.genSalt(10);
- const hashedPassword = await bcrypt.hash(password, salt);
- user.password = hashedPassword;
- }
-
- if (profilePic) {
- if (user.profilePic) {
- await cloudinary.uploader.destroy(user.profilePic.split("/").pop().split(".")[0]);
- }
-
- const uploadedResponse = await cloudinary.uploader.upload(profilePic);
- profilePic = uploadedResponse.secure_url;
- }
-
- user.name = name || user.name;
- user.email = email || user.email;
- user.username = username || user.username;
- user.profilePic = profilePic || user.profilePic;
- user.bio = bio || user.bio;
-
- user = await user.save();
-
- // Find all posts that this user replied and update username and userProfilePic fields
- await Post.updateMany(
- { "replies.userId": userId },
- {
- $set: {
- "replies.$[reply].username": user.username,
- "replies.$[reply].userProfilePic": user.profilePic,
- },
- },
- { arrayFilters: [{ "reply.userId": userId }] }
- );
-
- // password should be null in response
- user.password = null;
-
- res.status(200).json(user);
- } catch (err) {
- res.status(500).json({ error: err.message });
- console.log("Error in updateUser: ", err.message);
- }
+ const { name, email, username, password, bio } = req.body;
+ let { profilePic } = req.body;
+
+ const userId = req.user._id;
+ try {
+ let user = await User.findById(userId);
+ if (!user) return res.status(400).json({ error: "User not found" });
+
+ if (req.params.id !== userId.toString())
+ return res
+ .status(400)
+ .json({ error: "You cannot update other user's profile" });
+
+ if (password) {
+ const salt = await bcrypt.genSalt(10);
+ const hashedPassword = await bcrypt.hash(password, salt);
+ user.password = hashedPassword;
+ }
+
+ if (profilePic) {
+ if (user.profilePic) {
+ await cloudinary.uploader.destroy(
+ user.profilePic.split("/").pop().split(".")[0]
+ );
+ }
+
+ const uploadedResponse = await cloudinary.uploader.upload(profilePic);
+ profilePic = uploadedResponse.secure_url;
+ }
+
+ user.name = name || user.name;
+ user.email = email || user.email;
+ user.username = username || user.username;
+ user.profilePic = profilePic || user.profilePic;
+ user.bio = bio || user.bio;
+
+ user = await user.save();
+
+ // Find all posts that this user replied and update username and userProfilePic fields
+ await Post.updateMany(
+ { "replies.userId": userId },
+ {
+ $set: {
+ "replies.$[reply].username": user.username,
+ "replies.$[reply].userProfilePic": user.profilePic,
+ },
+ },
+ { arrayFilters: [{ "reply.userId": userId }] }
+ );
+
+ // password should be null in response
+ user.password = null;
+
+ res.status(200).json(user);
+ } catch (err) {
+ res.status(500).json({ error: err.message });
+ console.log("Error in updateUser: ", err.message);
+ }
};
+// Start of integration code
const getSuggestedUsers = async (req, res) => {
- try {
- // exclude the current user from suggested users array and exclude users that current user is already following
- const userId = req.user._id;
+ try {
+ // exclude the current user from suggested users array and exclude users that current user is already following
+ const userId = req.user._id;
- const usersFollowedByYou = await User.findById(userId).select("following");
+ const usersFollowedByYou = await User.findById(userId).select("following");
- const users = await User.aggregate([
- {
- $match: {
- _id: { $ne: userId },
- },
- },
- {
- $sample: { size: 10 },
- },
- ]);
- const filteredUsers = users.filter((user) => !usersFollowedByYou.following.includes(user._id));
- const suggestedUsers = filteredUsers.slice(0, 4);
+ const users = await User.aggregate([
+ {
+ $match: {
+ _id: { $ne: userId },
+ },
+ },
+ {
+ $sample: { size: 10 },
+ },
+ ]);
+ const filteredUsers = users.filter(
+ (user) => !usersFollowedByYou.following.includes(user._id)
+ );
+ const suggestedUsers = filteredUsers.slice(0, 4);
- suggestedUsers.forEach((user) => (user.password = null));
+ suggestedUsers.forEach((user) => (user.password = null));
- res.status(200).json(suggestedUsers);
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ res.status(200).json(suggestedUsers);
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
};
const freezeAccount = async (req, res) => {
- try {
- const user = await User.findById(req.user._id);
- if (!user) {
- return res.status(400).json({ error: "User not found" });
- }
+ try {
+ const user = await User.findById(req.user._id);
+ if (!user) {
+ return res.status(400).json({ error: "User not found" });
+ }
- user.isFrozen = true;
- await user.save();
+ user.isFrozen = true;
+ await user.save();
- res.status(200).json({ success: true });
- } catch (error) {
- res.status(500).json({ error: error.message });
- }
+ res.status(200).json({ success: true });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
};
-export {
- signupUser,
- loginUser,
- logoutUser,
- followUnFollowUser,
- updateUser,
- getUserProfile,
- getSuggestedUsers,
- freezeAccount,
+// New function for awarding verification
+const awardVerification = async (req, res) => {
+ const { userId, verificationType } = req.body;
+
+ // Validate verification type
+ if (!["blue", "gold"].includes(verificationType)) {
+ return res.status(400).json({ error: "Invalid verification type" });
+ }
+
+ try {
+ const user = await User.findById(userId);
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Set the verification type
+ user.verification = verificationType;
+ await user.save();
+
+ res.status(200).json({ message: "Verification awarded", user });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ console.log("Error in awardVerification: ", error.message);
+ }
+};
+const adminFreezeUser = async (req, res) => {
+ try {
+ const { userId } = req.body;
+
+ if (userId === req.user._id.toString()) {
+ return res.status(400).json({ error: "Cannot perform action on yourself" });
+ }
+
+ const user = await User.findById(userId);
+ if (!user) return res.status(404).json({ error: "User not found" });
+
+ if (user.freezeCount >= 1) {
+ user.isBanned = true;
+ user.isFrozen = false;
+ await user.save();
+
+ // Send ban notification
+ try {
+ await transporter.sendMail({
+ from: "pearnet104@gmail.com",
+ to: user.email,
+ subject: "Account Banned",
+ text: "Your account has been banned. Unfortunately, until the foreseeable future, you will not be able to create an account with us again until further notice."
+ });
+ } catch (emailError) {
+ console.error("Failed to send ban notification:", emailError);
+ }
+
+ await deleteUserData(userId);
+ return res.json({ banned: true });
+ }
+
+ user.isFrozen = true;
+ user.freezeCount += 1;
+ user.freezeUntil = new Date(Date.now() + 14 * 86400000);
+ await user.save();
+
+ // Send freeze notification
+ try {
+ await transporter.sendMail({
+ from: "pearnet104@gmail.com",
+ to: user.email,
+ subject: "Account Frozen",
+ text: "You won't be able to access chat, commenting, and posting until you are unfrozen after 2 weeks."
+ });
+ } catch (emailError) {
+ console.error("Failed to send freeze notification:", emailError);
+ }
+
+ res.status(200).json({ success: true });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
+};
+
+const adminDeleteUser = async (req, res) => {
+ try {
+ const { userId } = req.body;
+
+ if (userId === req.user._id.toString()) {
+ return res.status(400).json({ error: "Cannot delete yourself" });
+ }
+
+ const user = await User.findById(userId);
+ if (!user) return res.status(404).json({ error: "User not found" });
+
+ // Send ban notification
+ try {
+ await transporter.sendMail({
+ from: "pearnet104@gmail.com",
+ to: user.email,
+ subject: "Account Banned",
+ text: "Your account has been banned. Unfortunately, until the foreseeable future, you will not be able to create an account with us again until further notice."
+ });
+ } catch (emailError) {
+ console.error("Failed to send ban notification:", emailError);
+ }
+
+ await deleteUserData(userId);
+ res.status(200).json({ success: true });
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
};
+
+// Add this helper function (implement actual deletion logic)
+// userController.js
+const deleteUserData = async (userId) => {
+ try {
+ // 1. Delete user's posts and associated data
+ await Post.deleteMany({ user: userId });
+
+ // 2. Remove user's replies from all posts
+ await Post.updateMany(
+ { "replies.userId": userId },
+ { $pull: { replies: { userId: userId } } }
+ );
+
+ // 3. Handle conversations and messages
+ const userConversations = await Conversation.find({
+ participants: userId,
+ });
+
+ // Delete all messages in these conversations
+ await Message.deleteMany({
+ conversation: { $in: userConversations.map((c) => c._id) },
+ });
+
+ // Delete the conversations themselves
+ await Conversation.deleteMany({
+ participants: userId,
+ });
+
+ // 4. Remove user from social connections
+ await User.updateMany(
+ { $or: [{ followers: userId }, { following: userId }] },
+ { $pull: { followers: userId, following: userId } }
+ );
+
+ // 5. Remove user from chat participants lists
+ await Conversation.updateMany(
+ { participants: userId },
+ { $pull: { participants: userId } }
+ );
+
+ // 6. Delete profile picture from Cloudinary
+ const user = await User.findById(userId);
+ if (user?.profilePic) {
+ const publicId = user.profilePic.split("/").pop().split(".")[0];
+ await cloudinary.uploader.destroy(publicId);
+ }
+
+ // 7. Finally delete the user document
+ await User.findByIdAndDelete(userId);
+
+ console.log(`Successfully deleted all data for user ${userId}`);
+ } catch (error) {
+ console.error("Error deleting user data:", error);
+ throw error;
+ }
+};
+export {
+ signupUser,
+ validateEmail,
+ verifyRoleMatch,
+ verifyOTP,
+ resendOTP,
+ loginUser,
+ logoutUser,
+ followUnFollowUser,
+ updateUser,
+ getUserProfile,
+ getSuggestedUsers,
+ freezeAccount,
+ awardVerification,
+ adminFreezeUser,
+ adminDeleteUser,
+ deleteUserData, // Exporting the new function
+};
\ No newline at end of file
diff --git a/backend/cron/cron.js b/backend/cron/cron.js
index 9df5871..a4de6d2 100644
--- a/backend/cron/cron.js
+++ b/backend/cron/cron.js
@@ -1,7 +1,7 @@
import cron from "cron";
import https from "https";
-const URL = "https://threads-clone-9if3.onrender.com";
+const URL = "https://threads-clone-1-a9z0.onrender.com";
const job = new cron.CronJob("*/14 * * * *", function () {
https
diff --git a/backend/db/connectDB.js b/backend/db/connectDB.js
index 8002f60..c2bc8e3 100644
--- a/backend/db/connectDB.js
+++ b/backend/db/connectDB.js
@@ -1,5 +1,39 @@
import mongoose from "mongoose";
+import dotenv from "dotenv";
+dotenv.config(); // Load environment variables
+const connectDB = async () => {
+ try {
+ const conn = await mongoose.connect(process.env.MONGO_URI);
+ console.log(`MongoDB Connected: ${conn.connection.host}`);
+ } catch (err) {
+ console.error(`Error: ${err.message}`);
+ process.exit(1);
+ }
+};
+
+export default connectDB;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/* import mongoose from "mongoose";
const connectDB = async () => {
try {
const conn = await mongoose.connect(process.env.MONGO_URI, {
@@ -14,5 +48,4 @@ const connectDB = async () => {
process.exit(1);
}
};
-
-export default connectDB;
+export default connectDB; */
\ No newline at end of file
diff --git a/backend/middlewares/adminMiddleware.js b/backend/middlewares/adminMiddleware.js
new file mode 100644
index 0000000..6ad852d
--- /dev/null
+++ b/backend/middlewares/adminMiddleware.js
@@ -0,0 +1,15 @@
+import User from "../models/userModel.js";
+
+const adminMiddleware = async (req, res, next) => {
+ try {
+ const user = await User.findById(req.user._id);
+ if (user.role !== "admin") {
+ return res.status(403).json({ error: "Admin access required" });
+ }
+ next();
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
+};
+
+export default adminMiddleware;
\ No newline at end of file
diff --git a/backend/middlewares/checkChatAccess.js b/backend/middlewares/checkChatAccess.js
new file mode 100644
index 0000000..781b517
--- /dev/null
+++ b/backend/middlewares/checkChatAccess.js
@@ -0,0 +1,112 @@
+
+// // original
+// import User from "../models/userModel.js";
+
+// const checkChatAccess = async (req, res, next) => {
+// try {
+// if (!req.user || !req.user._id) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const userId = req.user._id;
+// const user = await User.findById(userId);
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const currentDate = new Date();
+// const dayOfWeek = currentDate.getDay();
+// const currentTime = currentDate.getHours() * 100 + currentDate.getMinutes();
+
+// const schoolStart = 810;
+// const lunchStart = 1250;
+// const lunchEnd = 1340;
+// const schoolEnd = 1535;
+
+// // Check if the day is a school day (Monday to Friday)
+// if (dayOfWeek >= 1 && dayOfWeek <= 5) {
+// if (user.role === "student") {
+// // Student access based on time
+// if (
+// currentTime < schoolStart ||
+// (currentTime >= lunchStart && currentTime <= lunchEnd) ||
+// currentTime > schoolEnd
+// ) {
+// return next();
+// } else {
+// return res.status(403).json({ error: "Access denied during school hours" });
+// }
+// } else {
+// // Teachers and admins have full access during school days
+// return next();
+// }
+// } else {
+// // Weekend access (no restrictions)
+// return next();
+// }
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export default checkChatAccess;
+
+
+// admin role update
+import User from "../models/userModel.js";
+
+const checkChatAccess = async (req, res, next) => {
+ try {
+ if (!req.user || !req.user._id) {
+ return res.status(401).json({ error: "Unauthorized" });
+ }
+
+ const userId = req.user._id;
+ const user = await User.findById(userId).select('role');
+
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Allow admin unrestricted access
+ if (user.role === "admin") {
+ return next();
+ }
+
+ const currentDate = new Date();
+ const dayOfWeek = currentDate.getDay();
+ const currentTime = currentDate.getHours() * 100 + currentDate.getMinutes();
+
+ const schoolStart = 810; // 8:10 AM
+ const lunchStart = 1250; // 12:50 PM
+ const lunchEnd = 1340; // 1:40 PM
+ const schoolEnd = 1535; // 3:35 PM
+
+ // Check if weekday (Monday-Friday)
+ if (dayOfWeek >= 1 && dayOfWeek <= 5) {
+ if (user.role === "student") {
+ // Students can only access during non-class hours
+ const isAllowed = currentTime < schoolStart ||
+ (currentTime >= lunchStart && currentTime <= lunchEnd) ||
+ currentTime > schoolEnd;
+
+ if (!isAllowed) {
+ return res.status(403).json({
+ error: "Chat access restricted during class hours (8:10 AM - 3:35 PM) except lunch break"
+ });
+ }
+ }
+ // Teachers have full access on weekdays
+ return next();
+ }
+
+ // Weekend access for everyone
+ next();
+ } catch (error) {
+ console.error("Chat access check error:", error);
+ res.status(500).json({ error: "Server error during access check" });
+ }
+};
+
+export default checkChatAccess;
\ No newline at end of file
diff --git a/backend/middlewares/checkTeacherAccess.js b/backend/middlewares/checkTeacherAccess.js
new file mode 100644
index 0000000..b259062
--- /dev/null
+++ b/backend/middlewares/checkTeacherAccess.js
@@ -0,0 +1,82 @@
+// // working previous version(original)
+// import User from "../models/userModel.js";
+
+// const checkTeacherAccess = async (req, res, next) => {
+// try {
+// if (!req.user || !req.user._id) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const userId = req.user._id;
+// const user = await User.findById(userId);
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// if (req.body.targetAudience && user.role !== "teacher") {
+// return res.status(403).json({ error: "Access denied for targeted posting" });
+// }
+
+// next();
+// } catch (error) {
+// res.status(500).json({ error: error.message });
+// }
+// };
+
+// export default checkTeacherAccess;
+
+
+// admin role update
+import User from "../models/userModel.js";
+
+const checkTeacherAccess = async (req, res, next) => {
+ try {
+ if (!req.user || !req.user._id) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ const userId = req.user._id;
+ const user = await User.findById(userId);
+
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // If user is a student, force target audience to "all"
+ if (user.role === "student") {
+ req.body.targetAudience = "all";
+ req.body.targetYearGroups = [];
+ req.body.targetDepartments = [];
+ return next();
+ }
+
+ // Check if the user is attempting to target posts
+ if (req.body.targetAudience) {
+ // If the user is not a teacher or admin, deny access to target posts
+ if (user.role !== "teacher" && user.role !== "admin") {
+ return res.status(403).json({ error: "Access denied for targeted posting" });
+ }
+
+ // If the user is a teacher, ensure they are targeting only their allowed year groups or departments
+ if (user.role === "teacher") {
+ const { targetYearGroups, targetDepartments } = user;
+ const { yearGroup, department } = req.body.targetAudience;
+
+ // Check if the yearGroup or department is valid for the teacher's access
+ if (
+ (yearGroup && !targetYearGroups.includes(yearGroup)) ||
+ (department && !targetDepartments.includes(department))
+ ) {
+ return res.status(403).json({ error: "Access denied: Invalid target audience for this teacher" });
+ }
+ }
+ }
+
+ next();
+ } catch (error) {
+ res.status(500).json({ error: error.message });
+ }
+};
+
+export default checkTeacherAccess;
diff --git a/backend/middlewares/filterPostsByAudience.js b/backend/middlewares/filterPostsByAudience.js
new file mode 100644
index 0000000..79fd712
--- /dev/null
+++ b/backend/middlewares/filterPostsByAudience.js
@@ -0,0 +1,125 @@
+// // this is the original
+// import User from "../models/userModel.js";
+
+// const filterPostsByYearGroup = async (req, res, next) => {
+// try {
+// if (!req.user || !req.user._id) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const user = await User.findById(req.user._id);
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// if (user.email.includes("students") && user.yearGroup) {
+// req.yearGroup = user.yearGroup;
+// } else {
+// req.yearGroup = "all";
+// }
+
+// next();
+// } catch (error) {
+// res.status(500).json({ error: "Error filtering posts by year group" });
+// }
+// };
+
+// export default filterPostsByYearGroup;
+
+
+// admin role update
+// import User from "../models/userModel.js";
+
+// const filterPostsByAudience = async (req, res, next) => {
+// try {
+// if (!req.user || !req.user._id) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// const user = await User.findById(req.user._id);
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// let filter = {};
+
+// if (user.role === "student") {
+// filter.targetYearGroups = { $in: [user.yearGroup, "all"] };
+// }
+
+// if (user.role === "teacher") {
+// filter.targetDepartments = { $in: [user.department] };
+// }
+
+// // Check if the user is admin or tv, and filter by targetTV
+// if (user.role === "admin") {
+// filter.targetTV = { $in: [true] }; // Admin can target TV posts
+// }
+
+// if (user.role === "tv") {
+// filter.targetTV = { $in: [true] }; // TV users see posts targeted to TV
+// }
+
+// req.filter = filter;
+// next();
+// } catch (error) {
+// return res.status(500).json({ error: "Failed to filter posts by audience" });
+// }
+// };
+
+// export default filterPostsByAudience;
+
+
+// filtering update testing
+import User from "../models/userModel.js";
+
+const filterPostsByAudience = async (req, res, next) => {
+ try {
+ // Ensure the user is authenticated
+ if (!req.user || !req.user._id) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Fetch the user's details
+ const user = await User.findById(req.user._id);
+
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
+
+ // Initialize an empty filter
+ let filter = {};
+
+ if (user.role === "student") {
+ // Students can only see posts targeted to their year group or all
+ filter = { targetYearGroups: { $in: [user.yearGroup, "all"] } };
+ } else if (user.role === "teacher") {
+ // Teachers can see posts targeted to their department or posts targeted to all
+ filter = {
+ $or: [
+ { targetDepartments: { $in: [user.department] } },
+ { targetYearGroups: "all" },
+ ],
+ };
+ } else if (user.role === "admin" || user.role === "tv") {
+ // Admins and TV users can access posts targeting TV
+ filter = { targetTV: { $in: [true] } };
+ } else {
+ return res.status(403).json({ error: "Access denied: invalid role" });
+ }
+
+ // Attach the filter to the request object for use in downstream operations
+ req.filter = filter;
+ next();
+ } catch (error) {
+ return res
+ .status(500)
+ .json({ error: "Failed to filter posts by audience", details: error.message });
+ }
+};
+
+export default filterPostsByAudience;
+
+
diff --git a/backend/middlewares/protectRoute.js b/backend/middlewares/protectRoute.js
index 1633ae9..a27b88b 100644
--- a/backend/middlewares/protectRoute.js
+++ b/backend/middlewares/protectRoute.js
@@ -1,23 +1,115 @@
-import User from "../models/userModel.js";
+// import User from "../models/userModel.js";
+// import jwt from "jsonwebtoken";
+
+// const protectRoute = async (req, res, next) => {
+// try {
+// const token = req.cookies.jwt;
+
+// if (!token) return res.status(401).json({ message: "Unauthorized" });
+
+// const decoded = jwt.verify(token, process.env.JWT_SECRET);
+
+// const user = await User.findById(decoded.userId).select("-password");
+
+// req.user = user;
+
+// next();
+// } catch (err) {
+// res.status(500).json({ message: err.message });
+// console.log("Error in signupUser: ", err.message);
+// }
+// };
+
+// export default protectRoute;
+
+
+// original working version
+// import jwt from "jsonwebtoken";
+// import User from "../models/userModel.js"; // Ensure the User model is imported
+
+// const protectRoute = async (req, res, next) => {
+// try {
+// const token = req.cookies.jwt;
+
+// if (!token) {
+// return res.status(401).json({ message: "Unauthorized, no token provided" });
+// }
+
+// const decoded = jwt.verify(token, process.env.JWT_SECRET);
+
+// if (!decoded) {
+// return res.status(401).json({ message: "Unauthorized, token verification failed" });
+// }
+
+// // If user is already present, skip the database lookup
+// if (req.user) {
+// next();
+// return;
+// }
+
+// const user = await User.findById(decoded.userId).select("-password");
+
+// if (!user) {
+// return res.status(404).json({ error: "User not found" });
+// }
+
+// req.user = user;
+// next();
+// } catch (err) {
+// console.error("Error in protectRoute middleware:", err.message);
+// res.status(500).json({ message: err.message });
+// }
+// };
+
+
+// export default protectRoute;
+
+
import jwt from "jsonwebtoken";
+import User from "../models/userModel.js";
const protectRoute = async (req, res, next) => {
- try {
- const token = req.cookies.jwt;
+ try {
+ const token = req.cookies.jwt;
+
+ if (!token) {
+ return res.status(401).json({ message: "Unauthorized, no token provided" });
+ }
+
+ const decoded = jwt.verify(token, process.env.JWT_SECRET);
+
+ if (!decoded) {
+ return res.status(401).json({ message: "Unauthorized, token verification failed" });
+ }
+
+ // Skip database lookup if user is already attached
+ if (req.user) {
+ return next();
+ }
- if (!token) return res.status(401).json({ message: "Unauthorized" });
+ const user = await User.findById(decoded.userId).select("-password");
- const decoded = jwt.verify(token, process.env.JWT_SECRET);
+ if (!user) {
+ return res.status(404).json({ error: "User not found" });
+ }
- const user = await User.findById(decoded.userId).select("-password");
+ // Add ban/freeze checks (NEW)
+ if (user.isBanned) {
+ return res.status(403).json({ error: "Account permanently banned" });
+ }
- req.user = user;
+ if (user.isFrozen && new Date() < user.freezeUntil) {
+ return res.status(403).json({
+ error: `Account frozen until ${user.freezeUntil.toLocaleDateString()}`
+ });
+ }
- next();
- } catch (err) {
- res.status(500).json({ message: err.message });
- console.log("Error in signupUser: ", err.message);
- }
+ req.user = user;
+ next();
+ } catch (err) {
+ console.error("Error in protectRoute middleware:", err.message);
+ res.status(500).json({ message: err.message });
+ }
};
-export default protectRoute;
+export default protectRoute;
\ No newline at end of file
diff --git a/backend/middlewares/validateObjectId.js b/backend/middlewares/validateObjectId.js
new file mode 100644
index 0000000..6e8b0a1
--- /dev/null
+++ b/backend/middlewares/validateObjectId.js
@@ -0,0 +1,19 @@
+// File: src/middlewares/validateObjectId.js
+
+import mongoose from "mongoose";
+
+const validateObjectId = (paramName) => {
+ return (req, res, next) => {
+ const id = req.params[paramName];
+
+ if (!mongoose.Types.ObjectId.isValid(id)) {
+ return res.status(400).json({
+ error: `Invalid ${paramName.replace('Id', ' ID')} format`
+ });
+ }
+
+ next();
+ };
+};
+
+export default validateObjectId;
\ No newline at end of file
diff --git a/backend/models/postModel.js b/backend/models/postModel.js
index 215c986..ca72dd2 100644
--- a/backend/models/postModel.js
+++ b/backend/models/postModel.js
@@ -1,50 +1,265 @@
+// //this is the original (working)
+// import mongoose from "mongoose";
+
+// const postSchema = mongoose.Schema(
+// {
+// postedBy: {
+// type: mongoose.Schema.Types.ObjectId,
+// ref: "User",
+// required: true,
+// },
+// text: {
+// type: String,
+// maxLength: 500,
+// },
+// img: {
+// type: String,
+// },
+// likes: {
+// type: [mongoose.Schema.Types.ObjectId],
+// ref: "User",
+// default: [],
+// },
+// replies: [
+// {
+// userId: {
+// type: mongoose.Schema.Types.ObjectId,
+// ref: "User",
+// required: true,
+// },
+// text: {
+// type: String,
+// required: true,
+// },
+// userProfilePic: {
+// type: String,
+// },
+// username: {
+// type: String,
+// },
+// },
+// ],
+// // other fields...
+// targetAudience: {
+// type: String,
+// enum: ['all', 'Year 12', 'Year 13', null], // Add null if you want to allow it
+// default: null, // Optionally set a default value
+// },
+// },
+// {
+// timestamps: true,
+// }
+// );
+
+// const Post = mongoose.model("Post", postSchema);
+
+// export default Post;
+
+// this is the admin role update(working)
+// import mongoose from "mongoose";
+
+// const postSchema = mongoose.Schema(
+// {
+// postedBy: {
+// type: mongoose.Schema.Types.ObjectId,
+// ref: "User",
+// required: true,
+// },
+// text: {
+// type: String,
+// maxLength: 500,
+// },
+// img: {
+// type: String,
+// },
+// likes: {
+// type: [mongoose.Schema.Types.ObjectId],
+// ref: "User",
+// default: [],
+// },
+// replies: [
+// {
+// userId: {
+// type: mongoose.Schema.Types.ObjectId,
+// ref: "User",
+// required: true,
+// },
+// text: {
+// type: String,
+// required: true,
+// },
+// userProfilePic: {
+// type: String,
+// },
+// username: {
+// type: String,
+// },
+// },
+// ],
+// // Target audience for students and teachers
+// targetAudience: {
+// type: String,
+// enum: [
+// "all",
+// "Year 9",
+// "Year 10",
+// "Year 11",
+// "Year 12",
+// "Year 13",
+// "Mathematics",
+// "Physics",
+// "Chemistry",
+// "Biology",
+// "Geography",
+// "Computer Science",
+// "Arts",
+// "History",
+// "Psychology",
+// "Sociology",
+// "Economics",
+// "Business",
+// "BTEC Business",
+// "Physical Education",
+// "BTEC Sport",
+// "Music",
+// "BTEC Music",
+// "BTEC Art",
+// "Englich",
+// "tv",
+// ],
+// default: "all",
+// },
+// // Specific year groups for targeting
+// targetYearGroups: {
+// type: [String], // Array to support multiple year groups
+// default: [], // Default is an empty array
+// },
+// // Specific departments for targeting
+// targetDepartments: {
+// type: [String], // Array to support multiple departments
+// default: [], // Default is an empty array
+// },
+// },
+// {
+// timestamps: true,
+// }
+// );
+// const Post = mongoose.model("Post", postSchema);
+
+// export default Post;
+
+
+// post review
import mongoose from "mongoose";
const postSchema = mongoose.Schema(
- {
- postedBy: {
- type: mongoose.Schema.Types.ObjectId,
- ref: "User",
- required: true,
- },
- text: {
- type: String,
- maxLength: 500,
- },
- img: {
- type: String,
- },
- likes: {
- // array of user ids
- type: [mongoose.Schema.Types.ObjectId],
- ref: "User",
- default: [],
- },
- replies: [
- {
- userId: {
- type: mongoose.Schema.Types.ObjectId,
- ref: "User",
- required: true,
- },
- text: {
- type: String,
- required: true,
- },
- userProfilePic: {
- type: String,
- },
- username: {
- type: String,
- },
- },
- ],
- },
- {
- timestamps: true,
- }
+ {
+ postedBy: {
+ type: mongoose.Schema.Types.ObjectId,
+ ref: "User",
+ required: true,
+ },
+ text: {
+ type: String,
+ maxLength: 500,
+ },
+ img: {
+ type: String,
+ },
+ likes: {
+ type: [mongoose.Schema.Types.ObjectId],
+ ref: "User",
+ default: [],
+ },
+ replies: [
+ {
+ userId: {
+ type: mongoose.Schema.Types.ObjectId,
+ ref: "User",
+ required: true,
+ },
+ text: {
+ type: String,
+ required: true,
+ },
+ userProfilePic: {
+ type: String,
+ },
+ username: {
+ type: String,
+ },
+ },
+ ],
+ // Target audience for students and teachers
+ targetAudience: {
+ type: String,
+ enum: [
+ "all",
+ "Year 9",
+ "Year 10",
+ "Year 11",
+ "Year 12",
+ "Year 13",
+ "Mathematics",
+ "Physics",
+ "Chemistry",
+ "Biology",
+ "Geography",
+ "Computer Science",
+ "Arts",
+ "History",
+ "Psychology",
+ "Sociology",
+ "Economics",
+ "Business",
+ "BTEC Business",
+ "Physical Education",
+ "BTEC Sport",
+ "Music",
+ "BTEC Music",
+ "BTEC Art",
+ "Englich",
+ "tv",
+
+ ],
+ default: "all",
+ },
+ // Specific year groups for targeting
+ targetYearGroups: {
+ type: [String], // Array to support multiple year groups
+ default: [], // Default is an empty array
+ },
+ // Specific departments for targeting
+ targetDepartments: {
+ type: [String], // Array to support multiple departments
+ default: [], // Default is an empty array
+ },
+ reviewStatus: {
+ type: String,
+ enum: ['pending', 'approved', 'rejected'],
+ default: 'approved' // Default approved for non-student posts
+ },
+ reviewers: [{
+ userId: {
+ type: mongoose.Schema.Types.ObjectId,
+ ref: "User"
+ },
+ role: {
+ type: String,
+ enum: ['admin', 'teacher', 'student']
+ },
+ decision: {
+ type: String,
+ enum: ['pending', 'approved', 'rejected'],
+ default: 'pending'
+ },
+ reviewedAt: Date
+ }]
+ },
+ {
+ timestamps: true,
+ }
);
-
const Post = mongoose.model("Post", postSchema);
-export default Post;
+export default Post;
\ No newline at end of file
diff --git a/backend/models/tempUserModel.js b/backend/models/tempUserModel.js
new file mode 100644
index 0000000..109647c
--- /dev/null
+++ b/backend/models/tempUserModel.js
@@ -0,0 +1,148 @@
+import mongoose from "mongoose";
+
+const tempUserSchema = mongoose.Schema({
+ name: {
+ type: String,
+ required: [true, "Name is required"],
+ trim: true
+ },
+ email: {
+ type: String,
+ required: [true, "Email is required"],
+ unique: true,
+ trim: true,
+ lowercase: true
+ },
+ username: {
+ type: String,
+ required: [true, "Username is required"],
+ unique: true,
+ trim: true
+ },
+ password: {
+ type: String,
+ required: [true, "Password is required"]
+ },
+ role: {
+ type: String,
+ required: [true, "Role is required"],
+ enum: {
+ values: ['student', 'teacher', 'admin'],
+ message: '{VALUE} is not a valid role'
+ }
+ },
+ yearGroup: {
+ type: String,
+ validate: {
+ validator: function(v) {
+ // Only required if role is student
+ if (this.role === 'student') {
+ return !!v;
+ }
+ return true;
+ },
+ message: 'Year group is required for students'
+ }
+ },
+ department: {
+ type: String,
+ validate: {
+ validator: function(v) {
+ // Only required if role is teacher
+ if (this.role === 'teacher') {
+ return !!v;
+ }
+ return true;
+ },
+ message: 'Department is required for teachers'
+ }
+ },
+ campus: {
+ type: String,
+ enum: {
+ values: ['karen', 'runda', 'admin'],
+ message: '{VALUE} is not a valid campus'
+ }
+ },
+ otp: {
+ type: Number,
+ required: [true, "OTP is required"],
+ validate: {
+ validator: function(v) {
+ // OTP should be a 4-digit number
+ return /^\d{4}$/.test(v.toString());
+ },
+ message: 'OTP must be a 4-digit number'
+ }
+ },
+ otpExpiry: {
+ type: Date,
+ required: [true, "OTP expiry is required"],
+ validate: {
+ validator: function(v) {
+ // OTP expiry should be in the future
+ return v > new Date();
+ },
+ message: 'OTP expiry must be in the future'
+ }
+ },
+ otpAttempts: {
+ type: Number,
+ default: 0,
+ min: [0, 'OTP attempts cannot be negative'],
+ max: [3, 'Maximum OTP attempts exceeded']
+ },
+ lastOtpSent: {
+ type: Date,
+ default: Date.now
+ }
+}, {
+ timestamps: true,
+ toJSON: { virtuals: true },
+ toObject: { virtuals: true }
+});
+
+// Add index for auto-deletion after 10 minutes
+tempUserSchema.index({ createdAt: 1 }, { expireAfterSeconds: 600 });
+
+// Add index for email and username uniqueness
+tempUserSchema.index({ email: 1 }, { unique: true });
+tempUserSchema.index({ username: 1 }, { unique: true });
+
+// Add virtual for checking if OTP is expired
+tempUserSchema.virtual('isOtpExpired').get(function() {
+ return Date.now() > this.otpExpiry;
+});
+
+// Add methods for OTP validation
+tempUserSchema.methods.isValidOtp = function(inputOtp) {
+ return !this.isOtpExpired && this.otp === parseInt(inputOtp, 10);
+};
+
+tempUserSchema.methods.incrementAttempts = async function() {
+ this.otpAttempts += 1;
+ await this.save();
+ return this.otpAttempts;
+};
+
+// Add pre-save middleware for data validation
+tempUserSchema.pre('save', function(next) {
+ // Convert email to lowercase
+ if (this.email) {
+ this.email = this.email.toLowerCase();
+ }
+
+ // Validate role-specific fields
+ if (this.role === 'student' && !this.yearGroup) {
+ next(new Error('Year group is required for students'));
+ }
+
+ if (this.role === 'teacher' && !this.department) {
+ next(new Error('Department is required for teachers'));
+ }
+
+ next();
+});
+
+const TempUser = mongoose.model("TempUser", tempUserSchema);
+export default TempUser;
\ No newline at end of file
diff --git a/backend/models/userModel.js b/backend/models/userModel.js
index 5289058..4bd5c87 100644
--- a/backend/models/userModel.js
+++ b/backend/models/userModel.js
@@ -1,52 +1,433 @@
+// // this is the original(working)
+// import mongoose from "mongoose";
+
+// const userSchema = mongoose.Schema(
+// {
+// name: {
+// type: String,
+// required: true,
+// },
+// username: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// email: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// password: {
+// type: String,
+// minLength: 6,
+// required: true,
+// },
+// profilePic: {
+// type: String,
+// default: "",
+// },
+// followers: {
+// type: [String],
+// default: [],
+// },
+// following: {
+// type: [String],
+// default: [],
+// },
+// bio: {
+// type: String,
+// default: "",
+// },
+// isFrozen: {
+// type: Boolean,
+// default: false,
+// },
+// verification: {
+// type: String,
+// enum: ["none", "blue", "golden"], // Available verification options
+// default: "none", // Default to no verification
+// },
+// isStudent: {
+// type: Boolean,
+// default: false, // This field determines if the user is a student or not
+// },
+// yearGroup: {
+// type: String, // Store the selected year group
+// required: function () {
+// return this.isStudent; // yearGroup is only required if the user is a student
+// },
+// },
+// role: {
+// type: String,
+// enum: ["user", "teacher", "student"], // Include 'student' in the allowed roles
+// required: function () {
+// return this.isStudent || this.role === "teacher"; // Role is required for students and teachers
+// },
+// default: "user", // Default to 'user' if not provided
+// },
+// },
+// {
+// timestamps: true, // This will automatically add `createdAt` and `updatedAt` fields
+// }
+// );
+
+// const User = mongoose.model("User", userSchema);
+
+// export default User;
+
+// this is the admin role update
+// import mongoose from "mongoose";
+
+// const userSchema = mongoose.Schema(
+// {
+// name: {
+// type: String,
+// required: true,
+// },
+// username: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// email: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// password: {
+// type: String,
+// minLength: 6,
+// required: true,
+// },
+// isVerified: { type: Boolean, default: false },
+// verificationToken: { type: String, required: false },
+// profilePic: {
+// type: String,
+// default: "",
+// },
+// followers: {
+// type: [String],
+// default: [],
+// },
+// following: {
+// type: [String],
+// default: [],
+// },
+// bio: {
+// type: String,
+// default: "",
+// },
+// isFrozen: {
+// type: Boolean,
+// default: false,
+// },
+// verification: {
+// type: String,
+// enum: ["none", "blue", "golden"],
+// default: "none",
+// },
+// isStudent: {
+// type: Boolean,
+// default: false,
+// },
+// yearGroup: {
+// type: String,
+// enum: ["Year 9", "Year 10", "Year 11", "Year 12", "Year 13"],
+// required: function () {
+// return this.role === "student";
+// },
+// },
+// role: {
+// type: String,
+// enum: ["user", "teacher", "student", "admin", "tv"],
+// required: true,
+// default: "user",
+// },
+// department: {
+// type: String,
+// enum: [
+// "Mathematics",
+// "Physics",
+// "Chemistry",
+// "Biology",
+// "Geography",
+// "Computer Science",
+// "Arts",
+// "History",
+// "Psychology",
+// "Sociology",
+// "Economics",
+// "Business",
+// "BTEC Business",
+// "Physical Education",
+// "BTEC Sport",
+// "Music",
+// "BTEC Music",
+// "BTEC Art",
+// "English",
+// "tv",
+// ],
+// required: function () {
+// return this.role === "teacher";
+// },
+// },
+
+// },
+// { timestamps: true }
+// );
+
+// const User = mongoose.model("User", userSchema);
+// export default User;
+
+// email verfification update(working)
+// import mongoose from "mongoose";
+
+// const userSchema = mongoose.Schema(
+// {
+// name: {
+// type: String,
+// required: true,
+// },
+// username: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// email: {
+// type: String,
+// required: true,
+// unique: true,
+// },
+// password: {
+// type: String,
+// minLength: 6,
+// required: true,
+// },
+// isVerified: { type: Boolean, default: false },
+// verificationToken: { type: String, required: false },
+// profilePic: {
+// type: String,
+// default: "",
+// },
+// followers: {
+// type: [String],
+// default: [],
+// },
+// following: {
+// type: [String],
+// default: [],
+// },
+// bio: {
+// type: String,
+// default: "",
+// },
+// isFrozen: {
+// type: Boolean,
+// default: false,
+// },
+// isFrozen: {
+// type: Boolean,
+// default: false,
+// },
+// freezeCount: {
+// type: Number,
+// default: 0,
+// },
+// freezeUntil: {
+// type: Date,
+// },
+// isBanned: {
+// type: Boolean,
+// default: false,
+// },
+// verification: {
+// type: String,
+// enum: ["none", "blue", "golden"],
+// default: "none",
+// },
+// isStudent: {
+// type: Boolean,
+// default: false,
+// },
+// yearGroup: {
+// type: String,
+// enum: ["Year 9", "Year 10", "Year 11", "Year 12", "Year 13"],
+// required: function () {
+// return this.role === "student";
+// },
+// },
+// role: {
+// type: String,
+// enum: ["user", "teacher", "student", "admin", "tv"],
+// required: true,
+// default: "user",
+// },
+// department: {
+// type: String,
+// enum: [
+// "Mathematics",
+// "Physics",
+// "Chemistry",
+// "Biology",
+// "Geography",
+// "Computer Science",
+// "Arts",
+// "History",
+// "Psychology",
+// "Sociology",
+// "Economics",
+// "Business",
+// "BTEC Business",
+// "Physical Education",
+// "BTEC Sport",
+// "Music",
+// "BTEC Music",
+// "BTEC Art",
+// "English",
+// "tv",
+// ],
+// required: function () {
+// return this.role === "teacher";
+// },
+// },
+// otp: { type: Number, required: false }, // Field for OTP
+// otpExpiry: { type: Date, required: false },
+// notificationPreferences: {
+// type: Boolean,
+// default: true, // Enable notifications by default
+// }, // Field for OTP expiration// Field for OTP expiration
+// },
+// { timestamps: true }
+// );
+
+// const User = mongoose.model("User", userSchema);
+// export default User;
+
+// validation update
import mongoose from "mongoose";
const userSchema = mongoose.Schema(
- {
- name: {
- type: String,
- required: true,
- },
- username: {
- type: String,
- required: true,
- unique: true,
- },
- email: {
- type: String,
- required: true,
- unique: true,
- },
- password: {
- type: String,
- minLength: 6,
- required: true,
- },
- profilePic: {
- type: String,
- default: "",
- },
- followers: {
- type: [String],
- default: [],
- },
- following: {
- type: [String],
- default: [],
- },
- bio: {
- type: String,
- default: "",
- },
- isFrozen: {
- type: Boolean,
- default: false,
- },
- },
- {
- timestamps: true,
- }
+ {
+ name: {
+ type: String,
+ required: true,
+ },
+ username: {
+ type: String,
+ required: true,
+ unique: true,
+ },
+ email: {
+ type: String,
+ required: true,
+ unique: true,
+ },
+ password: {
+ type: String,
+ minLength: 6,
+ required: true,
+ },
+ isVerified: { type: Boolean, default: false },
+ verificationToken: { type: String, required: false },
+ profilePic: {
+ type: String,
+ default: "",
+ },
+ followers: {
+ type: [String],
+ default: [],
+ },
+ following: {
+ type: [String],
+ default: [],
+ },
+ bio: {
+ type: String,
+ default: "",
+ },
+ isFrozen: {
+ type: Boolean,
+ default: false,
+ },
+ isFrozen: {
+ type: Boolean,
+ default: false,
+ },
+ freezeCount: {
+ type: Number,
+ default: 0,
+ },
+ freezeUntil: {
+ type: Date,
+ },
+ isBanned: {
+ type: Boolean,
+ default: false,
+ },
+ verification: {
+ type: String,
+ enum: ["none", "blue", "golden"],
+ default: "none",
+ },
+ isStudent: {
+ type: Boolean,
+ default: false,
+ },
+ yearGroup: {
+ type: String,
+ enum: ["Year 9", "Year 10", "Year 11", "Year 12", "Year 13"],
+ required: function () {
+ return this.role === "student";
+ },
+ },
+ campus: {
+ type: String,
+ enum: ['karen', 'runda', 'admin'],
+ required: true
+ },
+ role: {
+ type: String,
+ enum: ["user", "teacher", "student", "admin", "tv"],
+ required: true,
+ default: "user",
+ },
+ department: {
+ type: String,
+ enum: [
+ "Mathematics",
+ "Physics",
+ "Chemistry",
+ "Biology",
+ "Geography",
+ "Computer Science",
+ "Arts",
+ "History",
+ "Psychology",
+ "Sociology",
+ "Economics",
+ "Business",
+ "BTEC Business",
+ "Physical Education",
+ "BTEC Sport",
+ "Music",
+ "BTEC Music",
+ "BTEC Art",
+ "English",
+ "tv",
+ ],
+ required: function () {
+ return this.role === "teacher";
+ },
+ },
+ otp: { type: Number, required: false }, // Field for OTP
+ otpExpiry: { type: Date, required: false },
+ notificationPreferences: {
+ type: Boolean,
+ default: true, // Enable notifications by default
+ }, // Field for OTP expiration// Field for OTP expiration
+ },
+ { timestamps: true }
);
const User = mongoose.model("User", userSchema);
-
export default User;
diff --git a/backend/routes/messageRoutes.js b/backend/routes/messageRoutes.js
index ba620fd..7b4fc3f 100644
--- a/backend/routes/messageRoutes.js
+++ b/backend/routes/messageRoutes.js
@@ -1,11 +1,39 @@
+// // original version before roles update
+// import express from "express";
+// import protectRoute from "../middlewares/protectRoute.js";
+// import { getMessages, sendMessage, getConversations, deleteMessage } from "../controllers/messageController.js";
+
+
+// const router = express.Router();
+
+
+// router.get("/conversations", protectRoute, getConversations);
+// router.get("/:otherUserId", protectRoute, getMessages);
+// router.post("/", protectRoute, sendMessage);
+
+
+// // Added delete message route
+// router.delete("/:messageId", protectRoute, deleteMessage);
+
+
+// export default router;
+
+
+// version 2
import express from "express";
import protectRoute from "../middlewares/protectRoute.js";
-import { getMessages, sendMessage, getConversations } from "../controllers/messageController.js";
+import checkChatAccess from "../middlewares/checkChatAccess.js"; // Import the new middleware
+import { getMessages, sendMessage, getConversations, deleteMessage } from "../controllers/messageController.js";
const router = express.Router();
-router.get("/conversations", protectRoute, getConversations);
-router.get("/:otherUserId", protectRoute, getMessages);
-router.post("/", protectRoute, sendMessage);
+// Apply both protectRoute and checkChatAccess middleware
+router.get("/conversations", protectRoute, checkChatAccess, getConversations);
+router.get("/:otherUserId", protectRoute, checkChatAccess, getMessages);
+router.post("/", protectRoute, checkChatAccess, sendMessage);
+
+// Added delete message route
+router.delete("/:messageId", protectRoute, checkChatAccess, deleteMessage);
export default router;
+
diff --git a/backend/routes/postRoutes.js b/backend/routes/postRoutes.js
index 4397b2e..90814bc 100644
--- a/backend/routes/postRoutes.js
+++ b/backend/routes/postRoutes.js
@@ -1,23 +1,120 @@
+// athis is the orignal working version
+// import express from "express";
+// import {
+// createPost,
+// deletePost,
+// getPost,
+// likeUnlikePost,
+// replyToPost,
+// getFeedPosts,
+// getUserPosts,
+// } from "../controllers/postController.js";
+// import protectRoute from "../middlewares/protectRoute.js";
+// import checkTeacherAccess from "../middlewares/checkTeacherAccess.js"; // Import the teacher access middleware
+
+// const router = express.Router();
+
+// router.get("/feed", protectRoute, getFeedPosts);
+// router.get("/:id", protectRoute, getPost); // Added protectRoute for consistency
+// router.get("/user/:username", protectRoute, getUserPosts); // Added protectRoute for consistency
+// router.post("/create", protectRoute, checkTeacherAccess, createPost); // Add the checkTeacherAccess middleware
+// router.delete("/:id", protectRoute, deletePost);
+// router.put("/like/:id", protectRoute, likeUnlikePost);
+// router.put("/reply/:id", protectRoute, replyToPost);
+
+// export default router;
+
+// this is adding thje dmin role filtering update (working)
+// import express from "express";
+// import {
+// createPost,
+// deletePost,
+// getPost,
+// likeUnlikePost,
+// replyToPost,
+// getFeedPosts,
+// getUserPosts,
+// toggleNotifications, // Add the new controller
+// } from "../controllers/postController.js";
+// import protectRoute from "../middlewares/protectRoute.js";
+// import checkTeacherAccess from "../middlewares/checkTeacherAccess.js";
+// import filterPostsByAudience from "../middlewares/filterPostsByAudience.js";
+
+// const router = express.Router();
+
+// // Existing routes
+// router.get("/feed", protectRoute, getFeedPosts);
+// router.get("/:id", protectRoute, filterPostsByAudience, getPost);
+// router.get("/user/:username", protectRoute, getUserPosts);
+// router.post("/create", protectRoute, checkTeacherAccess, createPost);
+// router.delete("/:id", protectRoute, deletePost);
+// router.put("/like/:id", protectRoute, likeUnlikePost);
+// router.put("/reply/:id", protectRoute, replyToPost);
+
+// // New notification toggle route
+// router.post("/toggle-notifications", protectRoute, toggleNotifications);
+
+// export default router;
+
+// post review system
+// File: src/routes/postRoutes.js
+
import express from "express";
import {
- createPost,
- deletePost,
- getPost,
- likeUnlikePost,
- replyToPost,
- getFeedPosts,
- getUserPosts,
+ createPost,
+ deleteComment,
+ getPendingReviews,
+ reviewPost,
+ toggleNotifications,
+ getPost,
+ deletePost,
+ likeUnlikePost,
+ replyToPost,
+ getFeedPosts,
+ getUserPosts,
} from "../controllers/postController.js";
import protectRoute from "../middlewares/protectRoute.js";
+import checkTeacherAccess from "../middlewares/checkTeacherAccess.js";
+import filterPostsByAudience from "../middlewares/filterPostsByAudience.js";
+import validateObjectId from "../middlewares/validateObjectId.js";
const router = express.Router();
+// Review system routes
+router.get("/pending-reviews", protectRoute, getPendingReviews);
+router.post(
+ "/review/:postId",
+ protectRoute,
+ validateObjectId("postId"),
+ reviewPost
+);
+
+// Post creation and feed
+router.post("/create", protectRoute, checkTeacherAccess, createPost);
router.get("/feed", protectRoute, getFeedPosts);
-router.get("/:id", getPost);
-router.get("/user/:username", getUserPosts);
-router.post("/create", protectRoute, createPost);
-router.delete("/:id", protectRoute, deletePost);
-router.put("/like/:id", protectRoute, likeUnlikePost);
-router.put("/reply/:id", protectRoute, replyToPost);
+router.post("/toggle-notifications", protectRoute, toggleNotifications);
+
+// User-specific posts
+router.get("/user/:username", protectRoute, getUserPosts);
+
+// Single post operations
+router.get(
+ "/:id",
+ protectRoute,
+ validateObjectId("id"),
+ filterPostsByAudience,
+ getPost
+);
+router.delete("/:id", protectRoute, validateObjectId("id"), deletePost);
+router.put("/like/:id", protectRoute, validateObjectId("id"), likeUnlikePost);
+router.put("/reply/:id", protectRoute, validateObjectId("id"), replyToPost);
+
+// Comment operations
+router.delete(
+ "/comment/:commentId",
+ protectRoute,
+ validateObjectId("commentId"),
+ deleteComment
+);
export default router;
diff --git a/backend/routes/userRoutes.js b/backend/routes/userRoutes.js
index 2e61e9f..6406cc0 100644
--- a/backend/routes/userRoutes.js
+++ b/backend/routes/userRoutes.js
@@ -1,25 +1,94 @@
+// // working version (this is og og)
+// import express from "express";
+// import {
+// followUnFollowUser,
+// getUserProfile,
+// loginUser,
+// logoutUser,
+// signupUser,
+// updateUser,
+// getSuggestedUsers,
+// freezeAccount,
+// } from "../controllers/userController.js";
+// import protectRoute from "../middlewares/protectRoute.js";
+
+// const router = express.Router();
+
+// router.get("/profile/:query", getUserProfile);
+// router.get("/suggested", protectRoute, getSuggestedUsers);
+// router.post("/signup", signupUser);
+// router.post("/login", loginUser);
+// router.post("/logout", logoutUser);
+// router.post("/follow/:id", protectRoute, followUnFollowUser); // Toggle state(follow/unfollow)
+// router.put("/update/:id", protectRoute, updateUser);
+// router.put("/freeze", protectRoute, freezeAccount);
+
+// export default router;
+
+
+
+//admin role working
+// import express from "express";
+// import {
+// followUnFollowUser,
+// getUserProfile,
+// loginUser,
+// logoutUser,
+// signupUser,
+// updateUser,
+// getSuggestedUsers,
+// freezeAccount,
+// } from "../controllers/userController.js";
+// import protectRoute from "../middlewares/protectRoute.js";
+
+// const router = express.Router();
+
+// router.get("/profile/:query", getUserProfile);
+// router.get("/suggested", protectRoute, getSuggestedUsers);
+// router.post("/signup", signupUser);
+// router.post("/login", loginUser);
+// router.post("/logout", logoutUser);
+// router.post("/follow/:id", protectRoute, followUnFollowUser); // Toggle state(follow/unfollow)
+// router.put("/update/:id", protectRoute, updateUser);
+// router.put("/freeze", protectRoute, freezeAccount);
+
+// export default router;
+
+// email verififcation update import express from "express";
import express from "express";
import {
- followUnFollowUser,
- getUserProfile,
- loginUser,
- logoutUser,
- signupUser,
- updateUser,
- getSuggestedUsers,
- freezeAccount,
+ followUnFollowUser,
+ getUserProfile,
+ loginUser,
+ logoutUser,
+ signupUser,
+ updateUser,
+ getSuggestedUsers,
+ freezeAccount,
+ verifyOTP,
+ adminFreezeUser, // NEW IMPORT
+ adminDeleteUser // NEW IMPORT
} from "../controllers/userController.js";
import protectRoute from "../middlewares/protectRoute.js";
+import adminMiddleware from "../middlewares/adminMiddleware.js"; // NEW IMPORT
const router = express.Router();
+// Admin routes (NEW SECTION)
+router.post("/admin/freeze-user", protectRoute, adminMiddleware, adminFreezeUser);
+router.delete("/admin/delete-user", protectRoute, adminMiddleware, adminDeleteUser);
+
+// Existing routes
router.get("/profile/:query", getUserProfile);
router.get("/suggested", protectRoute, getSuggestedUsers);
router.post("/signup", signupUser);
router.post("/login", loginUser);
router.post("/logout", logoutUser);
-router.post("/follow/:id", protectRoute, followUnFollowUser); // Toggle state(follow/unfollow)
+router.post("/follow/:id", protectRoute, followUnFollowUser);
router.put("/update/:id", protectRoute, updateUser);
router.put("/freeze", protectRoute, freezeAccount);
+router.post("/verify-otp", verifyOTP);
export default router;
+
+
diff --git a/backend/server.js b/backend/server.js
index 630b2ae..fc14897 100644
--- a/backend/server.js
+++ b/backend/server.js
@@ -1,3 +1,4 @@
+// // this is the server version 1(wworks)
import path from "path";
import express from "express";
import dotenv from "dotenv";
@@ -46,3 +47,51 @@ if (process.env.NODE_ENV === "production") {
}
server.listen(PORT, () => console.log(`Server started at http://localhost:${PORT}`));
+
+
+// email verficiation update
+// import path from "path";
+// import express from "express";
+// import dotenv from "dotenv";
+// import connectDB from "./db/connectDB.js";
+// import cookieParser from "cookie-parser";
+// import userRoutes from "./routes/userRoutes.js";
+// import postRoutes from "./routes/postRoutes.js";
+// import messageRoutes from "./routes/messageRoutes.js";
+// import { v2 as cloudinary } from "cloudinary";
+// import { app, server } from "./socket/socket.js";
+// import job from "./cron/cron.js";
+
+// dotenv.config();
+
+// connectDB();
+// job.start();
+
+// const PORT = process.env.PORT || 5000;
+// const __dirname = path.resolve();
+
+// cloudinary.config({
+// cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
+// api_key: process.env.CLOUDINARY_API_KEY,
+// api_secret: process.env.CLOUDINARY_API_SECRET,
+// });
+
+// // Middlewares
+// app.use(express.json({ limit: "50mb" })); // To parse JSON data in the req.body
+// app.use(express.urlencoded({ extended: true })); // To parse form data in the req.body
+// app.use(cookieParser());
+
+// // Routes
+// app.use("/api/users", userRoutes);
+// app.use("/api/posts", postRoutes);
+// app.use("/api/messages", messageRoutes);
+
+// // React frontend setup
+// if (process.env.NODE_ENV === "production") {
+// app.use(express.static(path.join(__dirname, "/frontend/dist")));
+// app.get("*", (req, res) => {
+// res.sendFile(path.resolve(__dirname, "frontend", "dist", "index.html"));
+// });
+// }
+
+// server.listen(PORT, () => console.log(`Server started at http://localhost:${PORT}`));
diff --git a/frontend/index.html b/frontend/index.html
index 4c5e28b..f466c6c 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -2,9 +2,9 @@
-
+
- Threads Clone
+ Pear
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 7ab3a00..3b01d8c 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,7 +1,7 @@
{
"name": "threads-yt",
"version": "0.0.0",
- "lockfileVersion": 2,
+ "lockfileVersion": 3,
"requires": true,
"packages": {
"": {
@@ -9,12 +9,12 @@
"version": "0.0.0",
"dependencies": {
"@chakra-ui/icons": "^2.1.0",
- "@chakra-ui/react": "^2.7.1",
- "@emotion/react": "^11.11.1",
- "@emotion/styled": "^11.11.0",
+ "@chakra-ui/react": "^2.8.2",
+ "@emotion/react": "^11.13.0",
+ "@emotion/styled": "^11.13.0",
"backend": "file:..",
"date-fns": "^2.30.0",
- "framer-motion": "^10.12.21",
+ "framer-motion": "^10.18.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^4.10.1",
@@ -34,5102 +34,1272 @@
}
},
"..": {
+ "name": "backend",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"bcryptjs": "^2.4.3",
"cloudinary": "^1.40.0",
"cookie-parser": "^1.4.6",
- "dotenv": "^16.3.1",
- "express": "^4.18.2",
+ "cron": "^3.1.7",
+ "dotenv": "^16.4.5",
+ "express": "^4.21.0",
+ "framer-motion": "^11.5.4",
+ "i18next": "^23.14.0",
"jsonwebtoken": "^9.0.1",
"mongoose": "^7.4.0",
- "socket.io": "^4.7.2"
+ "react-i18next": "^15.0.1",
+ "socket.io": "^4.7.2",
+ "ws": "^8.18.0"
},
"devDependencies": {
"nodemon": "^3.0.1"
}
},
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "../node_modules/@mongodb-js/saslprep": {
+ "version": "1.1.8",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "sparse-bitfield": "^3.0.3"
}
},
- "node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "../node_modules/@socket.io/component-emitter": {
+ "version": "3.1.0",
+ "license": "MIT"
+ },
+ "../node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "license": "MIT"
+ },
+ "../node_modules/@types/cors": {
+ "version": "2.8.14",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "../node_modules/@types/luxon": {
+ "version": "3.4.2",
+ "license": "MIT"
+ },
+ "../node_modules/@types/node": {
+ "version": "20.4.4",
+ "license": "MIT"
+ },
+ "../node_modules/@types/webidl-conversions": {
+ "version": "7.0.3",
+ "license": "MIT"
+ },
+ "../node_modules/@types/whatwg-url": {
+ "version": "8.2.2",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/webidl-conversions": "*"
+ }
+ },
+ "../node_modules/abbrev": {
+ "version": "1.1.1",
"dev": true,
+ "license": "ISC"
+ },
+ "../node_modules/accepts": {
+ "version": "1.3.8",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/code-frame": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
- "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+ "../node_modules/anymatch": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/highlight": "^7.22.5"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 8"
}
},
- "node_modules/@babel/compat-data": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
- "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
+ "../node_modules/array-flatten": {
+ "version": "1.1.1",
+ "license": "MIT"
+ },
+ "../node_modules/balanced-match": {
+ "version": "1.0.2",
"dev": true,
+ "license": "MIT"
+ },
+ "../node_modules/base64id": {
+ "version": "2.0.0",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": "^4.5.0 || >= 5.9"
}
},
- "node_modules/@babel/core": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
- "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
+ "../node_modules/bcryptjs": {
+ "version": "2.4.3",
+ "license": "MIT"
+ },
+ "../node_modules/binary-extensions": {
+ "version": "2.2.0",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "../node_modules/body-parser": {
+ "version": "1.20.2",
+ "license": "MIT",
"dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.22.5",
- "@babel/generator": "^7.22.9",
- "@babel/helper-compilation-targets": "^7.22.9",
- "@babel/helper-module-transforms": "^7.22.9",
- "@babel/helpers": "^7.22.6",
- "@babel/parser": "^7.22.7",
- "@babel/template": "^7.22.5",
- "@babel/traverse": "^7.22.8",
- "@babel/types": "^7.22.5",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.2",
- "semver": "^6.3.1"
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/@babel/generator": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
- "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
+ "../node_modules/brace-expansion": {
+ "version": "1.1.11",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.22.5",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
- "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
+ "../node_modules/braces": {
+ "version": "3.0.3",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.22.9",
- "@babel/helper-validator-option": "^7.22.5",
- "browserslist": "^4.21.9",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
+ "fill-range": "^7.1.1"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">=8"
}
},
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
- "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
- "dev": true,
+ "../node_modules/bson": {
+ "version": "5.5.1",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=14.20.1"
}
},
- "node_modules/@babel/helper-function-name": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
- "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
- "dev": true,
+ "../node_modules/buffer-equal-constant-time": {
+ "version": "1.0.1",
+ "license": "BSD-3-Clause"
+ },
+ "../node_modules/bytes": {
+ "version": "3.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "../node_modules/call-bind": {
+ "version": "1.0.7",
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.22.5",
- "@babel/types": "^7.22.5"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "../node_modules/chokidar": {
+ "version": "3.5.3",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
}
},
- "node_modules/@babel/helper-module-imports": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
- "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+ "../node_modules/cloudinary": {
+ "version": "1.40.0",
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "cloudinary-core": "^2.13.0",
+ "core-js": "^3.30.1",
+ "lodash": "^4.17.21",
+ "q": "^1.5.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=0.6"
}
},
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
- "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
+ "../node_modules/cloudinary-core": {
+ "version": "2.13.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "lodash": ">=4.0"
+ }
+ },
+ "../node_modules/concat-map": {
+ "version": "0.0.1",
"dev": true,
+ "license": "MIT"
+ },
+ "../node_modules/content-disposition": {
+ "version": "0.5.4",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-module-imports": "^7.22.5",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.5"
+ "safe-buffer": "5.2.1"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
- "dev": true,
+ "../node_modules/content-type": {
+ "version": "1.0.5",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
- "dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
+ "../node_modules/cookie": {
+ "version": "0.4.1",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dev": true,
+ "../node_modules/cookie-parser": {
+ "version": "1.4.6",
+ "license": "MIT",
"dependencies": {
- "@babel/types": "^7.22.5"
+ "cookie": "0.4.1",
+ "cookie-signature": "1.0.6"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.8.0"
}
},
- "node_modules/@babel/helper-string-parser": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
- "engines": {
- "node": ">=6.9.0"
+ "../node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "license": "MIT"
+ },
+ "../node_modules/core-js": {
+ "version": "3.32.0",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
- "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+ "../node_modules/cors": {
+ "version": "2.8.5",
+ "license": "MIT",
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.10"
}
},
- "node_modules/@babel/helper-validator-option": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
- "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "../node_modules/cron": {
+ "version": "3.1.7",
+ "license": "MIT",
+ "dependencies": {
+ "@types/luxon": "~3.4.0",
+ "luxon": "~3.4.0"
}
},
- "node_modules/@babel/helpers": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
- "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
- "dev": true,
+ "../node_modules/debug": {
+ "version": "2.6.9",
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.22.5",
- "@babel/traverse": "^7.22.6",
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "ms": "2.0.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
- "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+ "../node_modules/define-data-property": {
+ "version": "1.1.4",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.22.5",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@babel/parser": {
- "version": "7.22.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
- "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
+ "../node_modules/depd": {
+ "version": "2.0.0",
+ "license": "MIT",
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 0.8"
}
},
- "node_modules/@babel/plugin-transform-react-jsx-self": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz",
- "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "../node_modules/destroy": {
+ "version": "1.2.0",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
}
},
- "node_modules/@babel/plugin-transform-react-jsx-source": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz",
- "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "../node_modules/dotenv": {
+ "version": "16.4.5",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=12"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "url": "https://dotenvx.com"
}
},
- "node_modules/@babel/runtime": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
- "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
+ "../node_modules/ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "license": "Apache-2.0",
"dependencies": {
- "regenerator-runtime": "^0.13.11"
- },
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "../node_modules/ee-first": {
+ "version": "1.1.1",
+ "license": "MIT"
+ },
+ "../node_modules/encodeurl": {
+ "version": "1.0.2",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.8"
}
},
- "node_modules/@babel/template": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
- "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
- "dev": true,
+ "../node_modules/engine.io": {
+ "version": "6.5.5",
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.22.5",
- "@babel/parser": "^7.22.5",
- "@babel/types": "^7.22.5"
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.17.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=10.2.0"
}
},
- "node_modules/@babel/traverse": {
- "version": "7.22.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
- "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
- "dev": true,
+ "../node_modules/engine.io-parser": {
+ "version": "5.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "../node_modules/engine.io/node_modules/debug": {
+ "version": "4.3.4",
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.22.5",
- "@babel/generator": "^7.22.7",
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-function-name": "^7.22.5",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.22.7",
- "@babel/types": "^7.22.5",
- "debug": "^4.1.0",
- "globals": "^11.1.0"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/@babel/types": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
- "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+ "../node_modules/engine.io/node_modules/ms": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "../node_modules/es-define-property": {
+ "version": "1.0.0",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-string-parser": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.5",
- "to-fast-properties": "^2.0.0"
+ "get-intrinsic": "^1.2.4"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 0.4"
}
},
- "node_modules/@chakra-ui/accordion": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.2.0.tgz",
- "integrity": "sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==",
- "dependencies": {
- "@chakra-ui/descendant": "3.0.14",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
+ "../node_modules/es-errors": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/@chakra-ui/alert": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz",
- "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==",
+ "../node_modules/escape-html": {
+ "version": "1.0.3",
+ "license": "MIT"
+ },
+ "../node_modules/etag": {
+ "version": "1.8.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "../node_modules/express": {
+ "version": "4.19.2",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.0.13"
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.2",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.6.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.2.0",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.11.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.18.0",
+ "serve-static": "1.15.0",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">= 0.10.0"
}
},
- "node_modules/@chakra-ui/anatomy": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz",
- "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ=="
+ "../node_modules/express/node_modules/cookie": {
+ "version": "0.6.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "node_modules/@chakra-ui/avatar": {
- "version": "2.2.11",
- "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.11.tgz",
- "integrity": "sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==",
+ "../node_modules/fill-range": {
+ "version": "7.1.1",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/image": "2.0.16",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
+ "to-regex-range": "^5.0.1"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@chakra-ui/breadcrumb": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz",
- "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==",
+ "../node_modules/finalhandler": {
+ "version": "1.2.0",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/@chakra-ui/breakpoint-utils": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz",
- "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
+ "../node_modules/forwarded": {
+ "version": "0.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@chakra-ui/button": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz",
- "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==",
- "dependencies": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.0.13"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/fresh": {
+ "version": "0.5.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@chakra-ui/card": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz",
- "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/fsevents": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/@chakra-ui/checkbox": {
- "version": "2.2.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.15.tgz",
- "integrity": "sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/visually-hidden": "2.0.15",
- "@zag-js/focus-visible": "0.2.2"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/function-bind": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/clickable": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz",
- "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==",
+ "../node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
},
- "peerDependencies": {
- "react": ">=18"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/close-button": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz",
- "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==",
+ "../node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@chakra-ui/icon": "3.0.16"
+ "is-glob": "^4.0.1"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/@chakra-ui/color-mode": {
- "version": "2.1.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz",
- "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==",
+ "../node_modules/gopd": {
+ "version": "1.0.1",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ "get-intrinsic": "^1.1.3"
},
- "peerDependencies": {
- "react": ">=18"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/control-box": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz",
- "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/has-flag": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/@chakra-ui/counter": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz",
- "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==",
+ "../node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
+ "es-define-property": "^1.0.0"
},
- "peerDependencies": {
- "react": ">=18"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/css-reset": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.2.tgz",
- "integrity": "sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A==",
- "peerDependencies": {
- "@emotion/react": ">=10.0.35",
- "react": ">=18"
+ "../node_modules/has-proto": {
+ "version": "1.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/descendant": {
- "version": "3.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz",
- "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==",
- "dependencies": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7"
+ "../node_modules/has-symbols": {
+ "version": "1.0.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "react": ">=18"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@chakra-ui/dom-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz",
- "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ=="
- },
- "node_modules/@chakra-ui/editable": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.0.0.tgz",
- "integrity": "sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==",
+ "../node_modules/hasown": {
+ "version": "2.0.2",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
+ "function-bind": "^1.1.2"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/@chakra-ui/event-utils": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz",
- "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw=="
- },
- "node_modules/@chakra-ui/focus-lock": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.17.tgz",
- "integrity": "sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==",
+ "../node_modules/http-errors": {
+ "version": "2.0.0",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "react-focus-lock": "^2.9.4"
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
},
- "peerDependencies": {
- "react": ">=18"
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/@chakra-ui/form-control": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz",
- "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==",
+ "../node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
+ "safer-buffer": ">= 2.1.2 < 3"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@chakra-ui/hooks": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.0.tgz",
- "integrity": "sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==",
+ "../node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "../node_modules/inherits": {
+ "version": "2.0.4",
+ "license": "ISC"
+ },
+ "../node_modules/ip-address": {
+ "version": "9.0.5",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-utils": "2.0.12",
- "@chakra-ui/utils": "2.0.15",
- "compute-scroll-into-view": "1.0.20",
- "copy-to-clipboard": "3.3.3"
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
},
- "peerDependencies": {
- "react": ">=18"
+ "engines": {
+ "node": ">= 12"
}
},
- "node_modules/@chakra-ui/icon": {
- "version": "3.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz",
- "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
}
},
- "node_modules/@chakra-ui/icons": {
+ "../node_modules/is-binary-path": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.1.0.tgz",
- "integrity": "sha512-pGFxFfQ/P5VnSRnTzK8zGAJxoxkxpHo/Br9ohRZdOpuhnIHSW7va0P53UoycEO5/vNJ/7BN0oDY0k9qurChcew==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/icon": "3.1.0"
+ "binary-extensions": "^2.0.0"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/@chakra-ui/icons/node_modules/@chakra-ui/icon": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.1.0.tgz",
- "integrity": "sha512-t6v0lGCXRbwUJycN8A/nDTuLktMP+LRjKbYJnd2oL6Pm2vOl99XwEQ5cAEyEa4XoseYNEgXiLR+2TfvgfNFvcw==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "../node_modules/is-extglob": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@chakra-ui/image": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.16.tgz",
- "integrity": "sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==",
+ "../node_modules/is-glob": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/shared-utils": "2.0.5"
+ "is-extglob": "^2.1.1"
},
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/@chakra-ui/input": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.22.tgz",
- "integrity": "sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/layout": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.2.0.tgz",
- "integrity": "sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==",
- "dependencies": {
- "@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/lazy-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz",
- "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg=="
- },
- "node_modules/@chakra-ui/live-region": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz",
- "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/media-query": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz",
- "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==",
- "dependencies": {
- "@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/react-env": "3.0.0",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/menu": {
- "version": "2.1.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.15.tgz",
- "integrity": "sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==",
- "dependencies": {
- "@chakra-ui/clickable": "2.0.14",
- "@chakra-ui/descendant": "3.0.14",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-animation-state": "2.0.9",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-focus-effect": "2.0.11",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-outside-click": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/modal": {
- "version": "2.2.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.12.tgz",
- "integrity": "sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==",
- "dependencies": {
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/focus-lock": "2.0.17",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16",
- "aria-hidden": "^1.2.2",
- "react-remove-scroll": "^2.5.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/number-input": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz",
- "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==",
- "dependencies": {
- "@chakra-ui/counter": "2.0.14",
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-interval": "2.0.5",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/number-utils": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz",
- "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg=="
- },
- "node_modules/@chakra-ui/object-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz",
- "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ=="
- },
- "node_modules/@chakra-ui/pin-input": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz",
- "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==",
- "dependencies": {
- "@chakra-ui/descendant": "3.0.14",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/popover": {
- "version": "2.1.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.12.tgz",
- "integrity": "sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==",
- "dependencies": {
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-animation-state": "2.0.9",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-focus-effect": "2.0.11",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/popper": {
- "version": "3.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.14.tgz",
- "integrity": "sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==",
- "dependencies": {
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@popperjs/core": "^2.9.3"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/portal": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz",
- "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==",
- "dependencies": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
- },
- "peerDependencies": {
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/progress": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz",
- "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==",
- "dependencies": {
- "@chakra-ui/react-context": "2.0.8"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/provider": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.3.0.tgz",
- "integrity": "sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==",
- "dependencies": {
- "@chakra-ui/css-reset": "2.1.2",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-env": "3.0.0",
- "@chakra-ui/system": "2.5.8",
- "@chakra-ui/utils": "2.0.15"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/radio": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz",
- "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==",
- "dependencies": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@zag-js/focus-visible": "0.2.2"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.7.1.tgz",
- "integrity": "sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==",
- "dependencies": {
- "@chakra-ui/accordion": "2.2.0",
- "@chakra-ui/alert": "2.1.0",
- "@chakra-ui/avatar": "2.2.11",
- "@chakra-ui/breadcrumb": "2.1.5",
- "@chakra-ui/button": "2.0.18",
- "@chakra-ui/card": "2.1.6",
- "@chakra-ui/checkbox": "2.2.15",
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/control-box": "2.0.13",
- "@chakra-ui/counter": "2.0.14",
- "@chakra-ui/css-reset": "2.1.2",
- "@chakra-ui/editable": "3.0.0",
- "@chakra-ui/focus-lock": "2.0.17",
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/hooks": "2.2.0",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/image": "2.0.16",
- "@chakra-ui/input": "2.0.22",
- "@chakra-ui/layout": "2.2.0",
- "@chakra-ui/live-region": "2.0.13",
- "@chakra-ui/media-query": "3.2.12",
- "@chakra-ui/menu": "2.1.15",
- "@chakra-ui/modal": "2.2.12",
- "@chakra-ui/number-input": "2.0.19",
- "@chakra-ui/pin-input": "2.0.20",
- "@chakra-ui/popover": "2.1.12",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/progress": "2.1.6",
- "@chakra-ui/provider": "2.3.0",
- "@chakra-ui/radio": "2.0.22",
- "@chakra-ui/react-env": "3.0.0",
- "@chakra-ui/select": "2.0.19",
- "@chakra-ui/skeleton": "2.0.24",
- "@chakra-ui/skip-nav": "2.0.15",
- "@chakra-ui/slider": "2.0.25",
- "@chakra-ui/spinner": "2.0.13",
- "@chakra-ui/stat": "2.0.18",
- "@chakra-ui/stepper": "2.2.0",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/switch": "2.0.27",
- "@chakra-ui/system": "2.5.8",
- "@chakra-ui/table": "2.0.17",
- "@chakra-ui/tabs": "2.1.9",
- "@chakra-ui/tag": "3.0.0",
- "@chakra-ui/textarea": "2.0.19",
- "@chakra-ui/theme": "3.1.2",
- "@chakra-ui/theme-utils": "2.0.18",
- "@chakra-ui/toast": "6.1.4",
- "@chakra-ui/tooltip": "2.2.9",
- "@chakra-ui/transition": "2.0.16",
- "@chakra-ui/utils": "2.0.15",
- "@chakra-ui/visually-hidden": "2.0.15"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-children-utils": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz",
- "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-context": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz",
- "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-env": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz",
- "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==",
- "dependencies": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-types": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz",
- "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-animation-state": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.9.tgz",
- "integrity": "sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-callback-ref": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz",
- "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-controllable-state": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz",
- "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-disclosure": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz",
- "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-event-listener": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz",
- "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-focus-effect": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.11.tgz",
- "integrity": "sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-focus-on-pointer-down": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz",
- "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==",
- "dependencies": {
- "@chakra-ui/react-use-event-listener": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-interval": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz",
- "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-latest-ref": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz",
- "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-merge-refs": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz",
- "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-outside-click": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.1.0.tgz",
- "integrity": "sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-pan-event": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz",
- "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==",
- "dependencies": {
- "@chakra-ui/event-utils": "2.0.8",
- "@chakra-ui/react-use-latest-ref": "2.0.5",
- "framesync": "6.1.2"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-previous": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz",
- "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-safe-layout-effect": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz",
- "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-size": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz",
- "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==",
- "dependencies": {
- "@zag-js/element-size": "0.3.2"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-timeout": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz",
- "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==",
- "dependencies": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-use-update-effect": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz",
- "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==",
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/react-utils": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz",
- "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==",
- "dependencies": {
- "@chakra-ui/utils": "2.0.15"
- },
- "peerDependencies": {
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/select": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz",
- "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/shared-utils": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz",
- "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q=="
- },
- "node_modules/@chakra-ui/skeleton": {
- "version": "2.0.24",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz",
- "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==",
- "dependencies": {
- "@chakra-ui/media-query": "3.2.12",
- "@chakra-ui/react-use-previous": "2.0.5",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/skip-nav": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.0.15.tgz",
- "integrity": "sha512-5UtmlnV4BmIgEk6lQ0h81JEYhPX04wJEk5ZMoilQ2zEQYL6TkVVHkhRXyc1Zfq76hmHuZPXZV/yJeTecj6jIrA==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/slider": {
- "version": "2.0.25",
- "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.25.tgz",
- "integrity": "sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==",
- "dependencies": {
- "@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-latest-ref": "2.0.5",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-pan-event": "2.0.9",
- "@chakra-ui/react-use-size": "2.0.10",
- "@chakra-ui/react-use-update-effect": "2.0.7"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/spinner": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz",
- "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/stat": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz",
- "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==",
- "dependencies": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/stepper": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.2.0.tgz",
- "integrity": "sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==",
- "dependencies": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/styled-system": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.1.tgz",
- "integrity": "sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5",
- "csstype": "^3.0.11",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/switch": {
- "version": "2.0.27",
- "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.27.tgz",
- "integrity": "sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==",
- "dependencies": {
- "@chakra-ui/checkbox": "2.2.15",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/system": {
- "version": "2.5.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.8.tgz",
- "integrity": "sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==",
- "dependencies": {
- "@chakra-ui/color-mode": "2.1.12",
- "@chakra-ui/object-utils": "2.1.0",
- "@chakra-ui/react-utils": "2.0.12",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme-utils": "2.0.18",
- "@chakra-ui/utils": "2.0.15",
- "react-fast-compare": "3.2.1"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0",
- "@emotion/styled": "^11.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/table": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz",
- "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==",
- "dependencies": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/tabs": {
- "version": "2.1.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz",
- "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==",
- "dependencies": {
- "@chakra-ui/clickable": "2.0.14",
- "@chakra-ui/descendant": "3.0.14",
- "@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/tag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz",
- "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==",
- "dependencies": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/textarea": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz",
- "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==",
- "dependencies": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/theme": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.1.2.tgz",
- "integrity": "sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==",
- "dependencies": {
- "@chakra-ui/anatomy": "2.1.2",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/theme-tools": "2.0.18"
- },
- "peerDependencies": {
- "@chakra-ui/styled-system": ">=2.8.0"
- }
- },
- "node_modules/@chakra-ui/theme-tools": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.18.tgz",
- "integrity": "sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==",
- "dependencies": {
- "@chakra-ui/anatomy": "2.1.2",
- "@chakra-ui/shared-utils": "2.0.5",
- "color2k": "^2.0.0"
- },
- "peerDependencies": {
- "@chakra-ui/styled-system": ">=2.0.0"
- }
- },
- "node_modules/@chakra-ui/theme-utils": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.18.tgz",
- "integrity": "sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme": "3.1.2",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/toast": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.4.tgz",
- "integrity": "sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==",
- "dependencies": {
- "@chakra-ui/alert": "2.1.0",
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-timeout": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme": "3.1.2"
- },
- "peerDependencies": {
- "@chakra-ui/system": "2.5.8",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/tooltip": {
- "version": "2.2.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.9.tgz",
- "integrity": "sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==",
- "dependencies": {
- "@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "framer-motion": ">=4.0.0",
- "react": ">=18",
- "react-dom": ">=18"
- }
- },
- "node_modules/@chakra-ui/transition": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz",
- "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==",
- "dependencies": {
- "@chakra-ui/shared-utils": "2.0.5"
- },
- "peerDependencies": {
- "framer-motion": ">=4.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@chakra-ui/utils": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz",
- "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==",
- "dependencies": {
- "@types/lodash.mergewith": "4.6.7",
- "css-box-model": "1.2.1",
- "framesync": "6.1.2",
- "lodash.mergewith": "4.6.2"
- }
- },
- "node_modules/@chakra-ui/visually-hidden": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz",
- "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==",
- "peerDependencies": {
- "@chakra-ui/system": ">=2.0.0",
- "react": ">=18"
- }
- },
- "node_modules/@emotion/babel-plugin": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
- "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
- "dependencies": {
- "@babel/helper-module-imports": "^7.16.7",
- "@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/serialize": "^1.1.2",
- "babel-plugin-macros": "^3.1.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^4.0.0",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@emotion/cache": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
- "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
- "dependencies": {
- "@emotion/memoize": "^0.8.1",
- "@emotion/sheet": "^1.2.2",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "stylis": "4.2.0"
- }
- },
- "node_modules/@emotion/hash": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
- "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
- },
- "node_modules/@emotion/is-prop-valid": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
- "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
- "dependencies": {
- "@emotion/memoize": "^0.8.1"
- }
- },
- "node_modules/@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
- },
- "node_modules/@emotion/react": {
- "version": "11.11.1",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
- "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/cache": "^11.11.0",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
- "hoist-non-react-statics": "^3.3.1"
- },
- "peerDependencies": {
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/serialize": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
- "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
- "dependencies": {
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/unitless": "^0.8.1",
- "@emotion/utils": "^1.2.1",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@emotion/sheet": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
- "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
- },
- "node_modules/@emotion/styled": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
- "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/is-prop-valid": "^1.2.1",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1"
- },
- "peerDependencies": {
- "@emotion/react": "^11.0.0-rc.0",
- "react": ">=16.8.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
- },
- "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
- "peerDependencies": {
- "react": ">=16.8.0"
- }
- },
- "node_modules/@emotion/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
- },
- "node_modules/@emotion/weak-memoize": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
- "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.13.tgz",
- "integrity": "sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.13.tgz",
- "integrity": "sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.13.tgz",
- "integrity": "sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.13.tgz",
- "integrity": "sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.13.tgz",
- "integrity": "sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.13.tgz",
- "integrity": "sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.13.tgz",
- "integrity": "sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.13.tgz",
- "integrity": "sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.13.tgz",
- "integrity": "sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.13.tgz",
- "integrity": "sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.13.tgz",
- "integrity": "sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.13.tgz",
- "integrity": "sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg==",
- "cpu": [
- "mips64el"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.13.tgz",
- "integrity": "sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.13.tgz",
- "integrity": "sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.13.tgz",
- "integrity": "sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.13.tgz",
- "integrity": "sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.13.tgz",
- "integrity": "sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.13.tgz",
- "integrity": "sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.13.tgz",
- "integrity": "sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.13.tgz",
- "integrity": "sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.13.tgz",
- "integrity": "sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.13.tgz",
- "integrity": "sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^3.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
- "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
- "dev": true,
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
- "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/js": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
- "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
- "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
- "dev": true,
- "dependencies": {
- "@humanwhocodes/object-schema": "^1.2.1",
- "debug": "^4.1.1",
- "minimatch": "^3.0.5"
- },
- "engines": {
- "node": ">=10.10.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/object-schema": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true,
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
- "dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- }
- },
- "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@remix-run/router": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz",
- "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ==",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/@socket.io/component-emitter": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
- },
- "node_modules/@types/lodash": {
- "version": "4.14.195",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
- "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg=="
- },
- "node_modules/@types/lodash.mergewith": {
- "version": "4.6.7",
- "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz",
- "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==",
- "dependencies": {
- "@types/lodash": "*"
- }
- },
- "node_modules/@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- },
- "node_modules/@types/prop-types": {
- "version": "15.7.5",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
- "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
- "devOptional": true
- },
- "node_modules/@types/react": {
- "version": "18.2.15",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz",
- "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==",
- "devOptional": true,
- "dependencies": {
- "@types/prop-types": "*",
- "@types/scheduler": "*",
- "csstype": "^3.0.2"
- }
- },
- "node_modules/@types/react-dom": {
- "version": "18.2.7",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
- "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
- "dev": true,
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/scheduler": {
- "version": "0.16.3",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
- "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
- "devOptional": true
- },
- "node_modules/@vitejs/plugin-react": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz",
- "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==",
- "dev": true,
- "dependencies": {
- "@babel/core": "^7.22.5",
- "@babel/plugin-transform-react-jsx-self": "^7.22.5",
- "@babel/plugin-transform-react-jsx-source": "^7.22.5",
- "react-refresh": "^0.14.0"
- },
- "engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "peerDependencies": {
- "vite": "^4.2.0"
- }
- },
- "node_modules/@zag-js/element-size": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
- "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
- },
- "node_modules/@zag-js/focus-visible": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
- "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
- },
- "node_modules/acorn": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
- },
- "node_modules/aria-hidden": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
- "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
- "dependencies": {
- "tslib": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-array-buffer": "^3.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
- "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
- "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.1.3"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/babel-plugin-macros": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "cosmiconfig": "^7.0.0",
- "resolve": "^1.19.0"
- },
- "engines": {
- "node": ">=10",
- "npm": ">=6"
- }
- },
- "node_modules/babel-plugin-macros/node_modules/resolve": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
- "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
- "dependencies": {
- "is-core-module": "^2.11.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/backend": {
- "resolved": "..",
- "link": true
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/browserslist": {
- "version": "4.21.9",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
- "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001503",
- "electron-to-chromium": "^1.4.431",
- "node-releases": "^2.0.12",
- "update-browserslist-db": "^1.0.11"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001516",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz",
- "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
- },
- "node_modules/color2k": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz",
- "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w=="
- },
- "node_modules/compute-scroll-into-view": {
- "version": "1.0.20",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
- "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
- },
- "node_modules/copy-to-clipboard": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
- "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
- "dependencies": {
- "toggle-selection": "^1.0.6"
- }
- },
- "node_modules/cosmiconfig": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "dependencies": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.2.1",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.10.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-box-model": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
- "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
- "dependencies": {
- "tiny-invariant": "^1.0.6"
- }
- },
- "node_modules/csstype": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
- },
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dependencies": {
- "@babel/runtime": "^7.21.0"
- },
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/define-properties": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
- "dev": true,
- "dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/detect-node-es": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.461",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz",
- "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==",
- "dev": true
- },
- "node_modules/engine.io-client": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz",
- "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==",
- "dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.1",
- "engine.io-parser": "~5.2.1",
- "ws": "~8.11.0",
- "xmlhttprequest-ssl": "~2.0.0"
- }
- },
- "node_modules/engine.io-parser": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
- "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.21.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz",
- "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.2.1",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "is-array-buffer": "^3.0.2",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.10",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.3",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.0",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trim": "^1.2.7",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
- "dev": true,
- "dependencies": {
- "has": "^1.0.3"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/esbuild": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.13.tgz",
- "integrity": "sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw==",
- "dev": true,
- "hasInstallScript": true,
- "bin": {
- "esbuild": "bin/esbuild"
- },
- "engines": {
- "node": ">=12"
- },
- "optionalDependencies": {
- "@esbuild/android-arm": "0.18.13",
- "@esbuild/android-arm64": "0.18.13",
- "@esbuild/android-x64": "0.18.13",
- "@esbuild/darwin-arm64": "0.18.13",
- "@esbuild/darwin-x64": "0.18.13",
- "@esbuild/freebsd-arm64": "0.18.13",
- "@esbuild/freebsd-x64": "0.18.13",
- "@esbuild/linux-arm": "0.18.13",
- "@esbuild/linux-arm64": "0.18.13",
- "@esbuild/linux-ia32": "0.18.13",
- "@esbuild/linux-loong64": "0.18.13",
- "@esbuild/linux-mips64el": "0.18.13",
- "@esbuild/linux-ppc64": "0.18.13",
- "@esbuild/linux-riscv64": "0.18.13",
- "@esbuild/linux-s390x": "0.18.13",
- "@esbuild/linux-x64": "0.18.13",
- "@esbuild/netbsd-x64": "0.18.13",
- "@esbuild/openbsd-x64": "0.18.13",
- "@esbuild/sunos-x64": "0.18.13",
- "@esbuild/win32-arm64": "0.18.13",
- "@esbuild/win32-ia32": "0.18.13",
- "@esbuild/win32-x64": "0.18.13"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.45.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
- "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.4.0",
- "@eslint/eslintrc": "^2.1.0",
- "@eslint/js": "8.44.0",
- "@humanwhocodes/config-array": "^0.11.10",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.0",
- "eslint-visitor-keys": "^3.4.1",
- "espree": "^9.6.0",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.32.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
- "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
- "doctrine": "^2.1.0",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
- "semver": "^6.3.0",
- "string.prototype.matchall": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react-refresh": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
- "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
- "dev": true,
- "peerDependencies": {
- "eslint": ">=7"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "7.2.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
- "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
- "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
- "dev": true
- },
- "node_modules/focus-lock": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
- "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==",
- "dependencies": {
- "tslib": "^2.0.3"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/framer-motion": {
- "version": "10.12.21",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.21.tgz",
- "integrity": "sha512-EmnP73O5+1OGm2jtQNoBPPuAJvhySl+p4/9PL7PPJHt58nkPWeFaxhCJaUDXDf6N3jSLluefxopc0FrMCQ+/tQ==",
- "dependencies": {
- "tslib": "^2.4.0"
- },
- "optionalDependencies": {
- "@emotion/is-prop-valid": "^0.8.2"
- },
- "peerDependencies": {
- "react": "^18.0.0",
- "react-dom": "^18.0.0"
- },
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-dom": {
- "optional": true
- }
- }
- },
- "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
- "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
- "optional": true,
- "dependencies": {
- "@emotion/memoize": "0.7.4"
- }
- },
- "node_modules/framer-motion/node_modules/@emotion/memoize": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
- "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
- "optional": true
- },
- "node_modules/framesync": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
- "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
- "dependencies": {
- "tslib": "2.4.0"
- }
- },
- "node_modules/framesync/node_modules/tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-nonce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/hamt_plus": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz",
- "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA=="
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "dependencies": {
- "react-is": "^16.7.0"
- }
- },
- "node_modules/ignore": {
- "version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dev": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
- },
- "node_modules/internal-slot": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.0",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
- },
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
- "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsx-ast-utils": {
- "version": "3.3.4",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
- "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
- },
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
- },
- "node_modules/lodash.mergewith": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
- "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
- },
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/node-releases": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
- "dev": true
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
- "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.fromentries": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
- "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.hasown": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
- "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
- "dev": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dev": true,
- "dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
- },
- "node_modules/postcss": {
- "version": "8.4.26",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz",
- "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "../node_modules/is-number": {
+ "version": "7.0.0",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=0.12.0"
}
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "../node_modules/jsbn": {
+ "version": "1.1.0",
+ "license": "MIT"
},
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "../node_modules/jsonwebtoken": {
+ "version": "9.0.1",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "jws": "^3.2.2",
+ "lodash": "^4.17.21",
+ "ms": "^2.1.1",
+ "semver": "^7.3.8"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12",
+ "npm": ">=6"
}
},
- "node_modules/react-clientside-effect": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz",
- "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==",
- "dependencies": {
- "@babel/runtime": "^7.12.13"
- },
- "peerDependencies": {
- "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
- }
+ "../node_modules/jsonwebtoken/node_modules/ms": {
+ "version": "2.1.3",
+ "license": "MIT"
},
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "../node_modules/jwa": {
+ "version": "1.4.1",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
- },
- "peerDependencies": {
- "react": "^18.2.0"
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/react-fast-compare": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz",
- "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg=="
- },
- "node_modules/react-focus-lock": {
- "version": "2.9.5",
- "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.5.tgz",
- "integrity": "sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA==",
+ "../node_modules/jws": {
+ "version": "3.2.2",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.0.0",
- "focus-lock": "^0.11.6",
- "prop-types": "^15.6.2",
- "react-clientside-effect": "^1.2.6",
- "use-callback-ref": "^1.3.0",
- "use-sidecar": "^1.1.2"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-icons": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz",
- "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==",
- "peerDependencies": {
- "react": "*"
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
}
},
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
- },
- "node_modules/react-refresh": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
- "dev": true,
+ "../node_modules/kareem": {
+ "version": "2.5.1",
+ "license": "Apache-2.0",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12.0.0"
}
},
- "node_modules/react-remove-scroll": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz",
- "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==",
- "dependencies": {
- "react-remove-scroll-bar": "^2.3.4",
- "react-style-singleton": "^2.2.1",
- "tslib": "^2.1.0",
- "use-callback-ref": "^1.3.0",
- "use-sidecar": "^1.1.2"
- },
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
+ "../node_modules/lodash": {
+ "version": "4.17.21",
+ "license": "MIT"
},
- "node_modules/react-remove-scroll-bar": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
- "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
+ "../node_modules/lru-cache": {
+ "version": "6.0.0",
+ "license": "ISC",
"dependencies": {
- "react-style-singleton": "^2.2.1",
- "tslib": "^2.0.0"
+ "yallist": "^4.0.0"
},
"engines": {
"node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
- }
- },
- "node_modules/react-router": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz",
- "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==",
- "dependencies": {
- "@remix-run/router": "1.7.1"
- },
- "engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": ">=16.8"
}
},
- "node_modules/react-router-dom": {
- "version": "6.14.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz",
- "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==",
- "dependencies": {
- "@remix-run/router": "1.7.1",
- "react-router": "6.14.1"
- },
+ "../node_modules/luxon": {
+ "version": "3.4.4",
+ "license": "MIT",
"engines": {
- "node": ">=14"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
+ "node": ">=12"
}
},
- "node_modules/react-style-singleton": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
- "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
- "dependencies": {
- "get-nonce": "^1.0.0",
- "invariant": "^2.2.4",
- "tslib": "^2.0.0"
- },
+ "../node_modules/media-typer": {
+ "version": "0.3.0",
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- }
+ "node": ">= 0.6"
}
},
- "node_modules/recoil": {
- "version": "0.7.7",
- "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz",
- "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==",
- "dependencies": {
- "hamt_plus": "1.0.2"
- },
- "peerDependencies": {
- "react": ">=16.13.1"
- },
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
+ "../node_modules/memory-pager": {
+ "version": "1.5.0",
+ "license": "MIT",
+ "optional": true
},
- "node_modules/regenerator-runtime": {
- "version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "../node_modules/merge-descriptors": {
+ "version": "1.0.1",
+ "license": "MIT"
},
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
- "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "functions-have-names": "^1.2.3"
- },
+ "../node_modules/methods": {
+ "version": "1.1.2",
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.6"
}
},
- "node_modules/resolve": {
- "version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.9.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
+ "../node_modules/mime": {
+ "version": "1.6.0",
+ "license": "MIT",
"bin": {
- "resolve": "bin/resolve"
+ "mime": "cli.js"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "../node_modules/mime-db": {
+ "version": "1.52.0",
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 0.6"
}
},
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
+ "../node_modules/mime-types": {
+ "version": "2.1.35",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
"engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
+ "node": ">= 0.6"
}
},
- "node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "../node_modules/minimatch": {
+ "version": "3.1.2",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
+ "brace-expansion": "^1.1.7"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "engines": {
+ "node": "*"
}
},
- "node_modules/rollup": {
- "version": "3.26.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz",
- "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==",
- "dev": true,
- "bin": {
- "rollup": "dist/bin/rollup"
+ "../node_modules/mongodb": {
+ "version": "5.9.2",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bson": "^5.5.0",
+ "mongodb-connection-string-url": "^2.6.0",
+ "socks": "^2.7.1"
},
"engines": {
- "node": ">=14.18.0",
- "npm": ">=8.0.0"
+ "node": ">=14.20.1"
},
"optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
+ "@mongodb-js/saslprep": "^1.1.0"
+ },
+ "peerDependencies": {
+ "@aws-sdk/credential-providers": "^3.188.0",
+ "@mongodb-js/zstd": "^1.0.0",
+ "kerberos": "^1.0.0 || ^2.0.0",
+ "mongodb-client-encryption": ">=2.3.0 <3",
+ "snappy": "^7.2.2"
+ },
+ "peerDependenciesMeta": {
+ "@aws-sdk/credential-providers": {
+ "optional": true
},
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "@mongodb-js/zstd": {
+ "optional": true
},
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "kerberos": {
+ "optional": true
+ },
+ "mongodb-client-encryption": {
+ "optional": true
+ },
+ "snappy": {
+ "optional": true
}
- ],
+ }
+ },
+ "../node_modules/mongodb-connection-string-url": {
+ "version": "2.6.0",
+ "license": "Apache-2.0",
"dependencies": {
- "queue-microtask": "^1.2.2"
+ "@types/whatwg-url": "^8.2.1",
+ "whatwg-url": "^11.0.0"
}
},
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
+ "../node_modules/mongoose": {
+ "version": "7.8.0",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
+ "bson": "^5.5.0",
+ "kareem": "2.5.1",
+ "mongodb": "5.9.2",
+ "mpath": "0.9.0",
+ "mquery": "5.0.0",
+ "ms": "2.1.3",
+ "sift": "16.0.1"
+ },
+ "engines": {
+ "node": ">=14.20.1"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/mongoose"
}
},
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "dependencies": {
- "loose-envify": "^1.1.0"
+ "../node_modules/mongoose/node_modules/ms": {
+ "version": "2.1.3",
+ "license": "MIT"
+ },
+ "../node_modules/mpath": {
+ "version": "0.9.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
}
},
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "../node_modules/mquery": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "4.x"
+ },
+ "engines": {
+ "node": ">=14.0.0"
}
},
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
+ "../node_modules/mquery/node_modules/debug": {
+ "version": "4.3.4",
+ "license": "MIT",
"dependencies": {
- "shebang-regex": "^3.0.0"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">=8"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
+ "../node_modules/mquery/node_modules/ms": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "../node_modules/ms": {
+ "version": "2.0.0",
+ "license": "MIT"
+ },
+ "../node_modules/negotiator": {
+ "version": "0.6.3",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.6"
}
},
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "../node_modules/nodemon": {
+ "version": "3.0.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "chokidar": "^3.5.2",
+ "debug": "^3.2.7",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
}
},
- "node_modules/socket.io-client": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz",
- "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==",
+ "../node_modules/nodemon/node_modules/debug": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.2",
- "engine.io-client": "~6.5.2",
- "socket.io-parser": "~4.2.4"
- },
- "engines": {
- "node": ">=10.0.0"
+ "ms": "^2.1.1"
}
},
- "node_modules/socket.io-parser": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
- "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "../node_modules/nodemon/node_modules/ms": {
+ "version": "2.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "../node_modules/nopt": {
+ "version": "1.0.10",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@socket.io/component-emitter": "~3.1.0",
- "debug": "~4.3.1"
+ "abbrev": "1"
},
- "engines": {
- "node": ">=10.0.0"
+ "bin": {
+ "nopt": "bin/nopt.js"
}
},
- "node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "../node_modules/normalize-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true,
+ "../node_modules/object-assign": {
+ "version": "4.1.1",
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/string.prototype.matchall": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
- "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.3",
- "regexp.prototype.flags": "^1.4.3",
- "side-channel": "^1.0.4"
+ "../node_modules/object-inspect": {
+ "version": "1.13.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/string.prototype.trim": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
- "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
- "dev": true,
+ "../node_modules/on-finished": {
+ "version": "2.4.1",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "ee-first": "1.1.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">= 0.8"
}
},
- "node_modules/string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "../node_modules/parseurl": {
+ "version": "1.3.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
+ "../node_modules/path-to-regexp": {
+ "version": "0.1.7",
+ "license": "MIT"
+ },
+ "../node_modules/picomatch": {
+ "version": "2.3.1",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
+ "../node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.10"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "../node_modules/pstree.remy": {
+ "version": "1.1.8",
"dev": true,
+ "license": "MIT"
+ },
+ "../node_modules/punycode": {
+ "version": "2.3.1",
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6"
+ }
+ },
+ "../node_modules/q": {
+ "version": "1.5.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.0",
+ "teleport": ">=0.2.0"
+ }
+ },
+ "../node_modules/qs": {
+ "version": "6.11.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/stylis": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "../node_modules/range-parser": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "../node_modules/raw-body": {
+ "version": "2.5.2",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.8"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
- "engines": {
- "node": ">= 0.4"
+ "../node_modules/readdirp": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8.10.0"
}
},
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
+ "../node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/tiny-invariant": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
- "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ "../node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "license": "MIT"
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "../node_modules/semver": {
+ "version": "7.5.4",
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=10"
}
},
- "node_modules/toggle-selection": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
- "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ "../node_modules/send": {
+ "version": "0.18.0",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "node_modules/tslib": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
- "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ "../node_modules/send/node_modules/ms": {
+ "version": "2.1.3",
+ "license": "MIT"
},
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
+ "../node_modules/serve-static": {
+ "version": "1.15.0",
+ "license": "MIT",
"dependencies": {
- "prelude-ls": "^1.2.1"
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.18.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "../node_modules/set-function-length": {
+ "version": "1.2.2",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
- "dev": true,
+ "../node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "license": "ISC"
+ },
+ "../node_modules/side-channel": {
+ "version": "1.0.6",
+ "license": "MIT",
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
},
"engines": {
"node": ">= 0.4"
@@ -5138,319 +1308,324 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "../node_modules/sift": {
+ "version": "16.0.1",
+ "license": "MIT"
+ },
+ "../node_modules/simple-update-notifier": {
+ "version": "2.0.0",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
+ "semver": "^7.5.3"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "../node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/update-browserslist-db": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "../node_modules/socket.io": {
+ "version": "4.7.2",
+ "license": "MIT",
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.5.2",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
},
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
+ "engines": {
+ "node": ">=10.2.0"
}
},
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
+ "../node_modules/socket.io-adapter": {
+ "version": "2.5.5",
+ "license": "MIT",
"dependencies": {
- "punycode": "^2.1.0"
+ "debug": "~4.3.4",
+ "ws": "~8.17.1"
}
},
- "node_modules/use-callback-ref": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
- "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
+ "../node_modules/socket.io-adapter/node_modules/debug": {
+ "version": "4.3.6",
+ "license": "MIT",
"dependencies": {
- "tslib": "^2.0.0"
+ "ms": "2.1.2"
},
"engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "node": ">=6.0"
},
"peerDependenciesMeta": {
- "@types/react": {
+ "supports-color": {
"optional": true
}
}
},
- "node_modules/use-sidecar": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
- "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "../node_modules/socket.io-adapter/node_modules/ms": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "../node_modules/socket.io-parser": {
+ "version": "4.2.4",
+ "license": "MIT",
"dependencies": {
- "detect-node-es": "^1.1.0",
- "tslib": "^2.0.0"
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=10.0.0"
+ }
+ },
+ "../node_modules/socket.io-parser/node_modules/debug": {
+ "version": "4.3.4",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.1.2"
},
- "peerDependencies": {
- "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "engines": {
+ "node": ">=6.0"
},
"peerDependenciesMeta": {
- "@types/react": {
+ "supports-color": {
"optional": true
}
}
},
- "node_modules/vite": {
- "version": "4.4.4",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz",
- "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==",
- "dev": true,
+ "../node_modules/socket.io-parser/node_modules/ms": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "../node_modules/socket.io/node_modules/debug": {
+ "version": "4.3.4",
+ "license": "MIT",
"dependencies": {
- "esbuild": "^0.18.10",
- "postcss": "^8.4.25",
- "rollup": "^3.25.2"
- },
- "bin": {
- "vite": "bin/vite.js"
+ "ms": "2.1.2"
},
"engines": {
- "node": "^14.18.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- },
- "peerDependencies": {
- "@types/node": ">= 14",
- "less": "*",
- "lightningcss": "^1.21.0",
- "sass": "*",
- "stylus": "*",
- "sugarss": "*",
- "terser": "^5.4.0"
+ "node": ">=6.0"
},
"peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "lightningcss": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
+ "supports-color": {
"optional": true
}
}
},
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
+ "../node_modules/socket.io/node_modules/ms": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "../node_modules/socks": {
+ "version": "2.8.3",
+ "license": "MIT",
"dependencies": {
- "isexe": "^2.0.0"
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
},
- "bin": {
- "node-which": "bin/node-which"
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "../node_modules/sparse-bitfield": {
+ "version": "3.0.3",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "memory-pager": "^1.0.2"
+ }
+ },
+ "../node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "license": "BSD-3-Clause"
+ },
+ "../node_modules/statuses": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "../node_modules/supports-color": {
+ "version": "5.5.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=4"
}
},
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "../node_modules/to-regex-range": {
+ "version": "5.0.1",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
+ "is-number": "^7.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=8.0"
}
},
- "node_modules/which-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz",
- "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==",
+ "../node_modules/toidentifier": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "../node_modules/touch": {
+ "version": "3.1.0",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
+ "nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "../node_modules/tr46": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "punycode": "^2.1.1"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
+ }
+ },
+ "../node_modules/type-is": {
+ "version": "1.6.18",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
+ "../node_modules/undefsafe": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/ws": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
- "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+ "../node_modules/unpipe": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "../node_modules/utils-merge": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "../node_modules/vary": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "../node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "../node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "../node_modules/ws": {
+ "version": "8.17.1",
+ "license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/xmlhttprequest-ssl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
- "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
- "node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "engines": {
- "node": ">= 6"
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "../node_modules/yallist": {
+ "version": "4.0.0",
+ "license": "ISC"
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
- }
- },
- "dependencies": {
- "@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true
},
- "@ampproject/remapping": {
+ "node_modules/@ampproject/remapping": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
- "requires": {
+ "license": "Apache-2.0",
+ "dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "@babel/code-frame": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
- "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
- "requires": {
- "@babel/highlight": "^7.22.5"
+ "node_modules/@babel/code-frame": {
+ "version": "7.24.7",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/highlight": "^7.24.7",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/compat-data": {
+ "node_modules/@babel/compat-data": {
"version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
- "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/core": {
+ "node_modules/@babel/core": {
"version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
- "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.22.5",
"@babel/generator": "^7.22.9",
@@ -5466,1411 +1641,1522 @@
"gensync": "^1.0.0-beta.2",
"json5": "^2.2.2",
"semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
}
},
- "@babel/generator": {
- "version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
- "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
+ "node_modules/@babel/generator": {
+ "version": "7.25.0",
"dev": true,
- "requires": {
- "@babel/types": "^7.22.5",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/helper-compilation-targets": {
+ "node_modules/@babel/helper-compilation-targets": {
"version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
- "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/compat-data": "^7.22.9",
"@babel/helper-validator-option": "^7.22.5",
"browserslist": "^4.21.9",
"lru-cache": "^5.1.1",
"semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "@babel/helper-environment-visitor": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
- "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
- "dev": true
- },
- "@babel/helper-function-name": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
- "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
- "dev": true,
- "requires": {
- "@babel/template": "^7.22.5",
- "@babel/types": "^7.22.5"
- }
- },
- "@babel/helper-hoist-variables": {
+ "node_modules/@babel/helper-environment-visitor": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
- "requires": {
- "@babel/types": "^7.22.5"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/helper-module-imports": {
+ "node_modules/@babel/helper-module-imports": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
- "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/helper-module-transforms": {
+ "node_modules/@babel/helper-module-transforms": {
"version": "7.22.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
- "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/helper-environment-visitor": "^7.22.5",
"@babel/helper-module-imports": "^7.22.5",
"@babel/helper-simple-access": "^7.22.5",
"@babel/helper-split-export-declaration": "^7.22.6",
"@babel/helper-validator-identifier": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
}
},
- "@babel/helper-plugin-utils": {
+ "node_modules/@babel/helper-plugin-utils": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/helper-simple-access": {
+ "node_modules/@babel/helper-simple-access": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/helper-split-export-declaration": {
+ "node_modules/@babel/helper-split-export-declaration": {
"version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/helper-string-parser": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw=="
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.8",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/helper-validator-identifier": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
- "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ=="
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/helper-validator-option": {
+ "node_modules/@babel/helper-validator-option": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
- "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "@babel/helpers": {
+ "node_modules/@babel/helpers": {
"version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
- "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/template": "^7.22.5",
"@babel/traverse": "^7.22.6",
"@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/highlight": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
- "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.22.5",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
+ "node_modules/@babel/highlight": {
+ "version": "7.24.7",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/parser": {
- "version": "7.22.7",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
- "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
- "dev": true
+ "node_modules/@babel/parser": {
+ "version": "7.25.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "@babel/plugin-transform-react-jsx-self": {
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz",
- "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "@babel/plugin-transform-react-jsx-source": {
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
"version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz",
- "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
}
},
- "@babel/runtime": {
+ "node_modules/@babel/runtime": {
"version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz",
- "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"regenerator-runtime": "^0.13.11"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/template": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
- "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+ "node_modules/@babel/template": {
+ "version": "7.25.0",
"dev": true,
- "requires": {
- "@babel/code-frame": "^7.22.5",
- "@babel/parser": "^7.22.5",
- "@babel/types": "^7.22.5"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/parser": "^7.25.0",
+ "@babel/types": "^7.25.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/traverse": {
- "version": "7.22.8",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
- "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
+ "node_modules/@babel/traverse": {
+ "version": "7.25.3",
"dev": true,
- "requires": {
- "@babel/code-frame": "^7.22.5",
- "@babel/generator": "^7.22.7",
- "@babel/helper-environment-visitor": "^7.22.5",
- "@babel/helper-function-name": "^7.22.5",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.22.7",
- "@babel/types": "^7.22.5",
- "debug": "^4.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.24.7",
+ "@babel/generator": "^7.25.0",
+ "@babel/parser": "^7.25.3",
+ "@babel/template": "^7.25.0",
+ "@babel/types": "^7.25.2",
+ "debug": "^4.3.1",
"globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@babel/types": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
- "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
- "requires": {
- "@babel/helper-string-parser": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.5",
+ "node_modules/@babel/types": {
+ "version": "7.25.2",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
"to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "@chakra-ui/accordion": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.2.0.tgz",
- "integrity": "sha512-2IK1iLzTZ22u8GKPPPn65mqJdZidn4AvkgAbv17ISdKA07VHJ8jSd4QF1T5iCXjKfZ0XaXozmhP4kDhjwF2IbQ==",
- "requires": {
- "@chakra-ui/descendant": "3.0.14",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "node_modules/@chakra-ui/accordion": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/descendant": "3.1.0",
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16"
+ "@chakra-ui/transition": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/alert": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.1.0.tgz",
- "integrity": "sha512-OcfHwoXI5VrmM+tHJTHT62Bx6TfyfCxSa0PWUOueJzSyhlUOKBND5we6UtrOB7D0jwX45qKKEDJOLG5yCG21jQ==",
- "requires": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/alert": {
+ "version": "2.2.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.0.13"
+ "@chakra-ui/spinner": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/anatomy": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.1.2.tgz",
- "integrity": "sha512-pKfOS/mztc4sUXHNc8ypJ1gPWSolWT770jrgVRfolVbYlki8y5Y+As996zMF6k5lewTu6j9DQequ7Cc9a69IVQ=="
- },
- "@chakra-ui/avatar": {
- "version": "2.2.11",
- "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.2.11.tgz",
- "integrity": "sha512-CJFkoWvlCTDJTUBrKA/aVyG5Zz6TBEIVmmsJtqC6VcQuVDTxkWod8ruXnjb0LT2DUveL7xR5qZM9a5IXcsH3zg==",
- "requires": {
- "@chakra-ui/image": "2.0.16",
+ "node_modules/@chakra-ui/anatomy": {
+ "version": "2.2.2",
+ "license": "MIT"
+ },
+ "node_modules/@chakra-ui/avatar": {
+ "version": "2.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/image": "2.1.0",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/breadcrumb": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.1.5.tgz",
- "integrity": "sha512-p3eQQrHQBkRB69xOmNyBJqEdfCrMt+e0eOH+Pm/DjFWfIVIbnIaFbmDCeWClqlLa21Ypc6h1hR9jEmvg8kmOog==",
- "requires": {
+ "node_modules/@chakra-ui/breadcrumb": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/breakpoint-utils": {
+ "node_modules/@chakra-ui/breakpoint-utils": {
"version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz",
- "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5"
}
},
- "@chakra-ui/button": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.0.18.tgz",
- "integrity": "sha512-E3c99+lOm6ou4nQVOTLkG+IdOPMjsQK+Qe7VyP8A/xeAMFONuibrWPRPpprr4ZkB4kEoLMfNuyH2+aEza3ScUA==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "node_modules/@chakra-ui/button": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/spinner": "2.0.13"
+ "@chakra-ui/spinner": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/card": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.1.6.tgz",
- "integrity": "sha512-fFd/WAdRNVY/WOSQv4skpy0WeVhhI0f7dTY1Sm0jVl0KLmuP/GnpsWtKtqWjNcV00K963EXDyhlk6+9oxbP4gw==",
- "requires": {
+ "node_modules/@chakra-ui/card": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/checkbox": {
- "version": "2.2.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.2.15.tgz",
- "integrity": "sha512-Ju2yQjX8azgFa5f6VLPuwdGYobZ+rdbcYqjiks848JvPc75UsPhpS05cb4XlrKT7M16I8txDA5rPJdqqFicHCA==",
- "requires": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/checkbox": {
+ "version": "2.3.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/form-control": "2.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/visually-hidden": "2.0.15",
- "@zag-js/focus-visible": "0.2.2"
+ "@chakra-ui/visually-hidden": "2.2.0",
+ "@zag-js/focus-visible": "0.16.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/clickable": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.0.14.tgz",
- "integrity": "sha512-jfsM1qaD74ZykLHmvmsKRhDyokLUxEfL8Il1VoZMNX5RBI0xW/56vKpLTFF/v/+vLPLS+Te2cZdD4+2O+G6ulA==",
- "requires": {
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "node_modules/@chakra-ui/clickable": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/close-button": {
+ "version": "2.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/close-button": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.0.17.tgz",
- "integrity": "sha512-05YPXk456t1Xa3KpqTrvm+7smx+95dmaPiwjiBN3p7LHUQVHJd8ZXSDB0V+WKi419k3cVQeJUdU/azDO2f40sw==",
- "requires": {
- "@chakra-ui/icon": "3.0.16"
+ "node_modules/@chakra-ui/color-mode": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/color-mode": {
- "version": "2.1.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.1.12.tgz",
- "integrity": "sha512-sYyfJGDoJSLYO+V2hxV9r033qhte5Nw/wAn5yRGGZnEEN1dKPEdWQ3XZvglWSDTNd0w9zkoH2w6vP4FBBYb/iw==",
- "requires": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ "node_modules/@chakra-ui/control-box": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/control-box": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.0.13.tgz",
- "integrity": "sha512-FEyrU4crxati80KUF/+1Z1CU3eZK6Sa0Yv7Z/ydtz9/tvGblXW9NFanoomXAOvcIFLbaLQPPATm9Gmpr7VG05A==",
- "requires": {}
- },
- "@chakra-ui/counter": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.0.14.tgz",
- "integrity": "sha512-KxcSRfUbb94dP77xTip2myoE7P2HQQN4V5fRJmNAGbzcyLciJ+aDylUU/UxgNcEjawUp6Q242NbWb1TSbKoqog==",
- "requires": {
+ "node_modules/@chakra-ui/counter": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/css-reset": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.1.2.tgz",
- "integrity": "sha512-4ySTLd+3iRpp4lX0yI9Yo2uQm2f+qwYGNOZF0cNcfN+4UJCd3IsaWxYRR/Anz+M51NVldZbYzC+TEYC/kpJc4A==",
- "requires": {}
+ "node_modules/@chakra-ui/css-reset": {
+ "version": "2.3.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "@emotion/react": ">=10.0.35",
+ "react": ">=18"
+ }
},
- "@chakra-ui/descendant": {
- "version": "3.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.0.14.tgz",
- "integrity": "sha512-+Ahvp9H4HMpfScIv9w1vaecGz7qWAaK1YFHHolz/SIsGLaLGlbdp+5UNabQC7L6TUnzzJDQDxzwif78rTD7ang==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7"
+ "node_modules/@chakra-ui/descendant": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/dom-utils": {
+ "node_modules/@chakra-ui/dom-utils": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz",
- "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ=="
+ "license": "MIT"
},
- "@chakra-ui/editable": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.0.0.tgz",
- "integrity": "sha512-q/7C/TM3iLaoQKlEiM8AY565i9NoaXtS6N6N4HWIEL5mZJPbMeHKxrCHUZlHxYuQJqFOGc09ZPD9fAFx1GkYwQ==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/editable": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/event-utils": {
+ "node_modules/@chakra-ui/event-utils": {
"version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz",
- "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw=="
- },
- "@chakra-ui/focus-lock": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.0.17.tgz",
- "integrity": "sha512-V+m4Ml9E8QY66DUpHX/imInVvz5XJ5zx59Tl0aNancXgeVY1Rt/ZdxuZdPLCAmPC/MF3GUOgnEA+WU8i+VL6Gw==",
- "requires": {
+ "license": "MIT"
+ },
+ "node_modules/@chakra-ui/focus-lock": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/dom-utils": "2.1.0",
"react-focus-lock": "^2.9.4"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/form-control": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.0.18.tgz",
- "integrity": "sha512-I0a0jG01IAtRPccOXSNugyRdUAe8Dy40ctqedZvznMweOXzbMCF1m+sHPLdWeWC/VI13VoAispdPY0/zHOdjsQ==",
- "requires": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/form-control": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/hooks": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.0.tgz",
- "integrity": "sha512-GZE64mcr20w+3KbCUPqQJHHmiFnX5Rcp8jS3YntGA4D5X2qU85jka7QkjfBwv/iduZ5Ei0YpCMYGCpi91dhD1Q==",
- "requires": {
+ "node_modules/@chakra-ui/hooks": {
+ "version": "2.2.1",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/react-utils": "2.0.12",
"@chakra-ui/utils": "2.0.15",
- "compute-scroll-into-view": "1.0.20",
+ "compute-scroll-into-view": "3.0.3",
"copy-to-clipboard": "3.3.3"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/icon": {
- "version": "3.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.0.16.tgz",
- "integrity": "sha512-RpA1X5Ptz8Mt39HSyEIW1wxAz2AXyf9H0JJ5HVx/dBdMZaGMDJ0HyyPBVci0m4RCoJuyG1HHG/DXJaVfUTVAeg==",
- "requires": {
+ "node_modules/@chakra-ui/icon": {
+ "version": "3.2.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/icons": {
+ "node_modules/@chakra-ui/icons": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.1.0.tgz",
- "integrity": "sha512-pGFxFfQ/P5VnSRnTzK8zGAJxoxkxpHo/Br9ohRZdOpuhnIHSW7va0P53UoycEO5/vNJ/7BN0oDY0k9qurChcew==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/icon": "3.1.0"
},
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/icons/node_modules/@chakra-ui/icon": {
+ "version": "3.1.0",
+ "license": "MIT",
"dependencies": {
- "@chakra-ui/icon": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.1.0.tgz",
- "integrity": "sha512-t6v0lGCXRbwUJycN8A/nDTuLktMP+LRjKbYJnd2oL6Pm2vOl99XwEQ5cAEyEa4XoseYNEgXiLR+2TfvgfNFvcw==",
- "requires": {
- "@chakra-ui/shared-utils": "2.0.5"
- }
- }
+ "@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/image": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.0.16.tgz",
- "integrity": "sha512-iFypk1slgP3OK7VIPOtkB0UuiqVxNalgA59yoRM43xLIeZAEZpKngUVno4A2kFS61yKN0eIY4hXD3Xjm+25EJA==",
- "requires": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "node_modules/@chakra-ui/image": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/input": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.0.22.tgz",
- "integrity": "sha512-dCIC0/Q7mjZf17YqgoQsnXn0bus6vgriTRn8VmxOc+WcVl+KBSTBWujGrS5yu85WIFQ0aeqQvziDnDQybPqAbA==",
- "requires": {
- "@chakra-ui/form-control": "2.0.18",
+ "node_modules/@chakra-ui/input": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/form-control": "2.2.0",
"@chakra-ui/object-utils": "2.1.0",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/layout": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.2.0.tgz",
- "integrity": "sha512-WvfsWQjqzbCxv7pbpPGVKxj9eQr7MC2i37ag4Wn7ClIG7uPuwHYTUWOnjnu27O3H/zA4cRVZ4Hs3GpSPbojZFQ==",
- "requires": {
+ "node_modules/@chakra-ui/layout": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/icon": "3.0.16",
+ "@chakra-ui/icon": "3.2.0",
"@chakra-ui/object-utils": "2.1.0",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/lazy-utils": {
+ "node_modules/@chakra-ui/lazy-utils": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz",
- "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg=="
+ "license": "MIT"
},
- "@chakra-ui/live-region": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.0.13.tgz",
- "integrity": "sha512-Ja+Slk6ZkxSA5oJzU2VuGU7TpZpbMb/4P4OUhIf2D30ctmIeXkxTWw1Bs1nGJAVtAPcGS5sKA+zb89i8g+0cTQ==",
- "requires": {}
- },
- "@chakra-ui/media-query": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.2.12.tgz",
- "integrity": "sha512-8pSLDf3oxxhFrhd40rs7vSeIBfvOmIKHA7DJlGUC/y+9irD24ZwgmCtFnn+y3gI47hTJsopbSX+wb8nr7XPswA==",
- "requires": {
+ "node_modules/@chakra-ui/live-region": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/media-query": {
+ "version": "3.3.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/breakpoint-utils": "2.0.8",
- "@chakra-ui/react-env": "3.0.0",
+ "@chakra-ui/react-env": "3.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/menu": {
- "version": "2.1.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.1.15.tgz",
- "integrity": "sha512-+1fh7KBKZyhy8wi7Q6nQAzrvjM6xggyhGMnSna0rt6FJVA2jlfkjb5FozyIVPnkfJKjkKd8THVhrs9E7pHNV/w==",
- "requires": {
- "@chakra-ui/clickable": "2.0.14",
- "@chakra-ui/descendant": "3.0.14",
+ "node_modules/@chakra-ui/menu": {
+ "version": "2.2.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/clickable": "2.1.0",
+ "@chakra-ui/descendant": "3.1.0",
"@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.0.14",
+ "@chakra-ui/popper": "3.1.0",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-animation-state": "2.0.9",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-focus-effect": "2.0.11",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-outside-click": "2.1.0",
- "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-animation-state": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-disclosure": "2.1.0",
+ "@chakra-ui/react-use-focus-effect": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-outside-click": "2.2.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16"
- }
- },
- "@chakra-ui/modal": {
- "version": "2.2.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.2.12.tgz",
- "integrity": "sha512-F1nNmYGvyqlmxidbwaBM3y57NhZ/Qeyc8BE9tb1FL1v9nxQhkfrPvMQ9miK0O1syPN6aZ5MMj+uD3AsRFE+/tA==",
- "requires": {
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/focus-lock": "2.0.17",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/transition": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/modal": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/close-button": "2.1.1",
+ "@chakra-ui/focus-lock": "2.1.0",
+ "@chakra-ui/portal": "2.1.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/transition": "2.0.16",
- "aria-hidden": "^1.2.2",
- "react-remove-scroll": "^2.5.5"
- }
- },
- "@chakra-ui/number-input": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.0.19.tgz",
- "integrity": "sha512-HDaITvtMEqOauOrCPsARDxKD9PSHmhWywpcyCSOX0lMe4xx2aaGhU0QQFhsJsykj8Er6pytMv6t0KZksdDv3YA==",
- "requires": {
- "@chakra-ui/counter": "2.0.14",
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/transition": "2.1.0",
+ "aria-hidden": "^1.2.3",
+ "react-remove-scroll": "^2.5.6"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/number-input": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/counter": "2.1.0",
+ "@chakra-ui/form-control": "2.2.0",
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-interval": "2.0.5",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
+ "@chakra-ui/react-use-callback-ref": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.1.0",
+ "@chakra-ui/react-use-interval": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/number-utils": {
+ "node_modules/@chakra-ui/number-utils": {
"version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz",
- "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg=="
+ "license": "MIT"
+ },
+ "node_modules/@chakra-ui/object-utils": {
+ "version": "2.1.0",
+ "license": "MIT"
},
- "@chakra-ui/object-utils": {
+ "node_modules/@chakra-ui/pin-input": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz",
- "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ=="
- },
- "@chakra-ui/pin-input": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.0.20.tgz",
- "integrity": "sha512-IHVmerrtHN8F+jRB3W1HnMir1S1TUCWhI7qDInxqPtoRffHt6mzZgLZ0izx8p1fD4HkW4c1d4/ZLEz9uH9bBRg==",
- "requires": {
- "@chakra-ui/descendant": "3.0.14",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/descendant": "3.1.0",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/popover": {
- "version": "2.1.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.1.12.tgz",
- "integrity": "sha512-Corh8trA1f3ydcMQqomgSvYNNhAlpxiBpMY2sglwYazOJcueHA8CI05cJVD0T/wwoTob7BShabhCGFZThn61Ng==",
- "requires": {
- "@chakra-ui/close-button": "2.0.17",
+ "node_modules/@chakra-ui/popover": {
+ "version": "2.2.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/close-button": "2.1.1",
"@chakra-ui/lazy-utils": "2.0.5",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/popper": "3.1.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-animation-state": "2.0.9",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-focus-effect": "2.0.11",
- "@chakra-ui/react-use-focus-on-pointer-down": "2.0.6",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-animation-state": "2.1.0",
+ "@chakra-ui/react-use-disclosure": "2.1.0",
+ "@chakra-ui/react-use-focus-effect": "2.1.0",
+ "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/popper": {
- "version": "3.0.14",
- "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.0.14.tgz",
- "integrity": "sha512-RDMmmSfjsmHJbVn2agDyoJpTbQK33fxx//njwJdeyM0zTG/3/4xjI/Cxru3acJ2Y+1jFGmPqhO81stFjnbtfIw==",
- "requires": {
+ "node_modules/@chakra-ui/popper": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@popperjs/core": "^2.9.3"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/portal": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.0.16.tgz",
- "integrity": "sha512-bVID0qbQ0l4xq38LdqAN4EKD4/uFkDnXzFwOlviC9sl0dNhzICDb1ltuH/Adl1d2HTMqyN60O3GO58eHy7plnQ==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ "node_modules/@chakra-ui/portal": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "@chakra-ui/progress": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.1.6.tgz",
- "integrity": "sha512-hHh5Ysv4z6bK+j2GJbi/FT9CVyto2PtNUNwBmr3oNMVsoOUMoRjczfXvvYqp0EHr9PCpxqrq7sRwgQXUzhbDSw==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8"
+ "node_modules/@chakra-ui/progress": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/provider": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.3.0.tgz",
- "integrity": "sha512-vKgmjoLVS3NnHW8RSYwmhhda2ZTi3fQc1egkYSVwngGky4CsN15I+XDhxJitVd66H41cjah/UNJyoeq7ACseLA==",
- "requires": {
- "@chakra-ui/css-reset": "2.1.2",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-env": "3.0.0",
- "@chakra-ui/system": "2.5.8",
+ "node_modules/@chakra-ui/provider": {
+ "version": "2.4.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/css-reset": "2.3.0",
+ "@chakra-ui/portal": "2.1.0",
+ "@chakra-ui/react-env": "3.1.0",
+ "@chakra-ui/system": "2.6.2",
"@chakra-ui/utils": "2.0.15"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0",
+ "@emotion/styled": "^11.0.0",
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "@chakra-ui/radio": {
- "version": "2.0.22",
- "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.0.22.tgz",
- "integrity": "sha512-GsQ5WAnLwivWl6gPk8P1x+tCcpVakCt5R5T0HumF7DGPXKdJbjS+RaFySrbETmyTJsKY4QrfXn+g8CWVrMjPjw==",
- "requires": {
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/radio": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/form-control": "2.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@zag-js/focus-visible": "0.2.2"
- }
- },
- "@chakra-ui/react": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.7.1.tgz",
- "integrity": "sha512-uIYIAg+gnUoRbgdCfSEVvQnrEz0oWWXATGGSQpxmuJovNVyZKnX/Xug7NkWQfBUJPYRSG+VB69ZmsAFpyLSMtA==",
- "requires": {
- "@chakra-ui/accordion": "2.2.0",
- "@chakra-ui/alert": "2.1.0",
- "@chakra-ui/avatar": "2.2.11",
- "@chakra-ui/breadcrumb": "2.1.5",
- "@chakra-ui/button": "2.0.18",
- "@chakra-ui/card": "2.1.6",
- "@chakra-ui/checkbox": "2.2.15",
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/control-box": "2.0.13",
- "@chakra-ui/counter": "2.0.14",
- "@chakra-ui/css-reset": "2.1.2",
- "@chakra-ui/editable": "3.0.0",
- "@chakra-ui/focus-lock": "2.0.17",
- "@chakra-ui/form-control": "2.0.18",
- "@chakra-ui/hooks": "2.2.0",
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/image": "2.0.16",
- "@chakra-ui/input": "2.0.22",
- "@chakra-ui/layout": "2.2.0",
- "@chakra-ui/live-region": "2.0.13",
- "@chakra-ui/media-query": "3.2.12",
- "@chakra-ui/menu": "2.1.15",
- "@chakra-ui/modal": "2.2.12",
- "@chakra-ui/number-input": "2.0.19",
- "@chakra-ui/pin-input": "2.0.20",
- "@chakra-ui/popover": "2.1.12",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/progress": "2.1.6",
- "@chakra-ui/provider": "2.3.0",
- "@chakra-ui/radio": "2.0.22",
- "@chakra-ui/react-env": "3.0.0",
- "@chakra-ui/select": "2.0.19",
- "@chakra-ui/skeleton": "2.0.24",
- "@chakra-ui/skip-nav": "2.0.15",
- "@chakra-ui/slider": "2.0.25",
- "@chakra-ui/spinner": "2.0.13",
- "@chakra-ui/stat": "2.0.18",
- "@chakra-ui/stepper": "2.2.0",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/switch": "2.0.27",
- "@chakra-ui/system": "2.5.8",
- "@chakra-ui/table": "2.0.17",
- "@chakra-ui/tabs": "2.1.9",
- "@chakra-ui/tag": "3.0.0",
- "@chakra-ui/textarea": "2.0.19",
- "@chakra-ui/theme": "3.1.2",
- "@chakra-ui/theme-utils": "2.0.18",
- "@chakra-ui/toast": "6.1.4",
- "@chakra-ui/tooltip": "2.2.9",
- "@chakra-ui/transition": "2.0.16",
+ "@zag-js/focus-visible": "0.16.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/react": {
+ "version": "2.8.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/accordion": "2.3.1",
+ "@chakra-ui/alert": "2.2.2",
+ "@chakra-ui/avatar": "2.3.0",
+ "@chakra-ui/breadcrumb": "2.2.0",
+ "@chakra-ui/button": "2.1.0",
+ "@chakra-ui/card": "2.2.0",
+ "@chakra-ui/checkbox": "2.3.2",
+ "@chakra-ui/close-button": "2.1.1",
+ "@chakra-ui/control-box": "2.1.0",
+ "@chakra-ui/counter": "2.1.0",
+ "@chakra-ui/css-reset": "2.3.0",
+ "@chakra-ui/editable": "3.1.0",
+ "@chakra-ui/focus-lock": "2.1.0",
+ "@chakra-ui/form-control": "2.2.0",
+ "@chakra-ui/hooks": "2.2.1",
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/image": "2.1.0",
+ "@chakra-ui/input": "2.1.2",
+ "@chakra-ui/layout": "2.3.1",
+ "@chakra-ui/live-region": "2.1.0",
+ "@chakra-ui/media-query": "3.3.0",
+ "@chakra-ui/menu": "2.2.1",
+ "@chakra-ui/modal": "2.3.1",
+ "@chakra-ui/number-input": "2.1.2",
+ "@chakra-ui/pin-input": "2.1.0",
+ "@chakra-ui/popover": "2.2.1",
+ "@chakra-ui/popper": "3.1.0",
+ "@chakra-ui/portal": "2.1.0",
+ "@chakra-ui/progress": "2.2.0",
+ "@chakra-ui/provider": "2.4.2",
+ "@chakra-ui/radio": "2.1.2",
+ "@chakra-ui/react-env": "3.1.0",
+ "@chakra-ui/select": "2.1.2",
+ "@chakra-ui/skeleton": "2.1.0",
+ "@chakra-ui/skip-nav": "2.1.0",
+ "@chakra-ui/slider": "2.1.0",
+ "@chakra-ui/spinner": "2.1.0",
+ "@chakra-ui/stat": "2.1.1",
+ "@chakra-ui/stepper": "2.3.1",
+ "@chakra-ui/styled-system": "2.9.2",
+ "@chakra-ui/switch": "2.1.2",
+ "@chakra-ui/system": "2.6.2",
+ "@chakra-ui/table": "2.1.0",
+ "@chakra-ui/tabs": "3.0.0",
+ "@chakra-ui/tag": "3.1.1",
+ "@chakra-ui/textarea": "2.1.2",
+ "@chakra-ui/theme": "3.3.1",
+ "@chakra-ui/theme-utils": "2.0.21",
+ "@chakra-ui/toast": "7.0.2",
+ "@chakra-ui/tooltip": "2.3.1",
+ "@chakra-ui/transition": "2.1.0",
"@chakra-ui/utils": "2.0.15",
- "@chakra-ui/visually-hidden": "2.0.15"
+ "@chakra-ui/visually-hidden": "2.2.0"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0",
+ "@emotion/styled": "^11.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "@chakra-ui/react-children-utils": {
+ "node_modules/@chakra-ui/react-children-utils": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz",
- "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==",
- "requires": {}
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-context": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.0.8.tgz",
- "integrity": "sha512-tRTKdn6lCTXM6WPjSokAAKCw2ioih7Eg8cNgaYRSwKBck8nkz9YqxgIIEj3dJD7MGtpl24S/SNI98iRWkRwR/A==",
- "requires": {}
+ "node_modules/@chakra-ui/react-context": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-env": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.0.0.tgz",
- "integrity": "sha512-tfMRO2v508HQWAqSADFrwZgR9oU10qC97oV6zGbjHh9ALP0/IcFR+Bi71KRTveDTm85fMeAzZYGj57P3Dsipkw==",
- "requires": {
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5"
+ "node_modules/@chakra-ui/react-env": {
+ "version": "3.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-types": {
+ "node_modules/@chakra-ui/react-types": {
"version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz",
- "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==",
- "requires": {}
- },
- "@chakra-ui/react-use-animation-state": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.0.9.tgz",
- "integrity": "sha512-WFoD5OG03PBmzJCoRwM8rVfU442AvKBPPgA0yGGlKioH29OGuX7W78Ml+cYdXxonTiB03YSRZzUwaUnP4wAy1Q==",
- "requires": {
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/react-use-animation-state": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.0.7"
+ "@chakra-ui/react-use-event-listener": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-callback-ref": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.0.7.tgz",
- "integrity": "sha512-YjT76nTpfHAK5NxplAlZsQwNju5KmQExnqsWNPFeOR6vvbC34+iPSTr+r91i1Hdy7gBSbevsOsd5Wm6RN3GuMw==",
- "requires": {}
+ "node_modules/@chakra-ui/react-use-callback-ref": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-use-controllable-state": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.0.8.tgz",
- "integrity": "sha512-F7rdCbLEmRjwwODqWZ3y+mKgSSHPcLQxeUygwk1BkZPXbKkJJKymOIjIynil2cbH7ku3hcSIWRvuhpCcfQWJ7Q==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "node_modules/@chakra-ui/react-use-controllable-state": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-disclosure": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.0.8.tgz",
- "integrity": "sha512-2ir/mHe1YND40e+FyLHnDsnDsBQPwzKDLzfe9GZri7y31oU83JSbHdlAXAhp3bpjohslwavtRCp+S/zRxfO9aQ==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "node_modules/@chakra-ui/react-use-disclosure": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-event-listener": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.0.7.tgz",
- "integrity": "sha512-4wvpx4yudIO3B31pOrXuTHDErawmwiXnvAN7gLEOVREi16+YGNcFnRJ5X5nRrmB7j2MDUtsEDpRBFfw5Z9xQ5g==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "node_modules/@chakra-ui/react-use-event-listener": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-focus-effect": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.0.11.tgz",
- "integrity": "sha512-/zadgjaCWD50TfuYsO1vDS2zSBs2p/l8P2DPEIA8FuaowbBubKrk9shKQDWmbfDU7KArGxPxrvo+VXvskPPjHw==",
- "requires": {
+ "node_modules/@chakra-ui/react-use-focus-effect": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7"
+ "@chakra-ui/react-use-event-listener": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-focus-on-pointer-down": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.0.6.tgz",
- "integrity": "sha512-OigXiLRVySn3tyVqJ/rn57WGuukW8TQe8fJYiLwXbcNyAMuYYounvRxvCy2b53sQ7QIZamza0N0jhirbH5FNoQ==",
- "requires": {
- "@chakra-ui/react-use-event-listener": "2.0.7"
+ "node_modules/@chakra-ui/react-use-focus-on-pointer-down": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-event-listener": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-interval": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.0.5.tgz",
- "integrity": "sha512-1nbdwMi2K87V6p5f5AseOKif2CkldLaJlq1TOqaPRwb7v3aU9rltBtYdf+fIyuHSToNJUV6wd9budCFdLCl3Fg==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "node_modules/@chakra-ui/react-use-interval": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-latest-ref": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.0.5.tgz",
- "integrity": "sha512-3mIuFzMyIo3Ok/D8uhV9voVg7KkrYVO/pwVvNPJOHsDQqCA6DpYE4WDsrIx+fVcwad3Ta7SupexR5PoI+kq6QQ==",
- "requires": {}
- },
- "@chakra-ui/react-use-merge-refs": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.0.7.tgz",
- "integrity": "sha512-zds4Uhsc+AMzdH8JDDkLVet9baUBgtOjPbhC5r3A0ZXjZvGhCztFAVE3aExYiVoMPoHLKbLcqvCWE6ioFKz1lw==",
- "requires": {}
+ "node_modules/@chakra-ui/react-use-latest-ref": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-use-outside-click": {
+ "node_modules/@chakra-ui/react-use-merge-refs": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.1.0.tgz",
- "integrity": "sha512-JanCo4QtWvMl9ZZUpKJKV62RlMWDFdPCE0Q64a7eWTOQgWWcpyBW7TOYRunQTqrK30FqkYFJCOlAWOtn+6Rw7A==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/react-use-outside-click": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-pan-event": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.0.9.tgz",
- "integrity": "sha512-xu35QXkiyrgsHUOnctl+SwNcwf9Rl62uYE5y8soKOZdBm8E+FvZIt2hxUzK1EoekbJCMzEZ0Yv1ZQCssVkSLaQ==",
- "requires": {
+ "node_modules/@chakra-ui/react-use-pan-event": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/event-utils": "2.0.8",
- "@chakra-ui/react-use-latest-ref": "2.0.5",
+ "@chakra-ui/react-use-latest-ref": "2.1.0",
"framesync": "6.1.2"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-previous": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.0.5.tgz",
- "integrity": "sha512-BIZgjycPE4Xr+MkhKe0h67uHXzQQkBX/u5rYPd65iMGdX1bCkbE0oorZNfOHLKdTmnEb4oVsNvfN6Rfr+Mnbxw==",
- "requires": {}
+ "node_modules/@chakra-ui/react-use-previous": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-use-safe-layout-effect": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.0.5.tgz",
- "integrity": "sha512-MwAQBz3VxoeFLaesaSEN87reVNVbjcQBDex2WGexAg6hUB6n4gc1OWYH/iXp4tzp4kuggBNhEHkk9BMYXWfhJQ==",
- "requires": {}
+ "node_modules/@chakra-ui/react-use-safe-layout-effect": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-use-size": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.0.10.tgz",
- "integrity": "sha512-fdIkH14GDnKQrtQfxX8N3gxbXRPXEl67Y3zeD9z4bKKcQUAYIMqs0MsPZY+FMpGQw8QqafM44nXfL038aIrC5w==",
- "requires": {
- "@zag-js/element-size": "0.3.2"
+ "node_modules/@chakra-ui/react-use-size": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@zag-js/element-size": "0.10.5"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-timeout": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.0.5.tgz",
- "integrity": "sha512-QqmB+jVphh3h/CS60PieorpY7UqSPkrQCB7f7F+i9vwwIjtP8fxVHMmkb64K7VlzQiMPzv12nlID5dqkzlv0mw==",
- "requires": {
- "@chakra-ui/react-use-callback-ref": "2.0.7"
+ "node_modules/@chakra-ui/react-use-timeout": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-use-callback-ref": "2.1.0"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/react-use-update-effect": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.0.7.tgz",
- "integrity": "sha512-vBM2bmmM83ZdDtasWv3PXPznpTUd+FvqBC8J8rxoRmvdMEfrxTiQRBJhiGHLpS9BPLLPQlosN6KdFU97csB6zg==",
- "requires": {}
+ "node_modules/@chakra-ui/react-use-update-effect": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=18"
+ }
},
- "@chakra-ui/react-utils": {
+ "node_modules/@chakra-ui/react-utils": {
"version": "2.0.12",
- "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz",
- "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/utils": "2.0.15"
+ },
+ "peerDependencies": {
+ "react": ">=18"
}
},
- "@chakra-ui/select": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.0.19.tgz",
- "integrity": "sha512-eAlFh+JhwtJ17OrB6fO6gEAGOMH18ERNrXLqWbYLrs674Le7xuREgtuAYDoxUzvYXYYTTdOJtVbcHGriI3o6rA==",
- "requires": {
- "@chakra-ui/form-control": "2.0.18",
+ "node_modules/@chakra-ui/select": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/form-control": "2.2.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/shared-utils": {
+ "node_modules/@chakra-ui/shared-utils": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz",
- "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q=="
- },
- "@chakra-ui/skeleton": {
- "version": "2.0.24",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.0.24.tgz",
- "integrity": "sha512-1jXtVKcl/jpbrJlc/TyMsFyI651GTXY5ma30kWyTXoby2E+cxbV6OR8GB/NMZdGxbQBax8/VdtYVjI0n+OBqWA==",
- "requires": {
- "@chakra-ui/media-query": "3.2.12",
- "@chakra-ui/react-use-previous": "2.0.5",
+ "license": "MIT"
+ },
+ "node_modules/@chakra-ui/skeleton": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/media-query": "3.3.0",
+ "@chakra-ui/react-use-previous": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/skip-nav": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.0.15.tgz",
- "integrity": "sha512-5UtmlnV4BmIgEk6lQ0h81JEYhPX04wJEk5ZMoilQ2zEQYL6TkVVHkhRXyc1Zfq76hmHuZPXZV/yJeTecj6jIrA==",
- "requires": {}
- },
- "@chakra-ui/slider": {
- "version": "2.0.25",
- "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.0.25.tgz",
- "integrity": "sha512-FnWSi0AIXP+9sHMCPboOKGqm902k8dJtsJ7tu3D0AcKkE62WtYLZ2sTqvwJxCfSl4KqVI1i571SrF9WadnnJ8w==",
- "requires": {
+ "node_modules/@chakra-ui/skip-nav": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/slider": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/number-utils": "2.0.7",
- "@chakra-ui/react-context": "2.0.8",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-callback-ref": "2.0.7",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-latest-ref": "2.0.5",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-pan-event": "2.0.9",
- "@chakra-ui/react-use-size": "2.0.10",
- "@chakra-ui/react-use-update-effect": "2.0.7"
+ "@chakra-ui/react-use-callback-ref": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-latest-ref": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-pan-event": "2.1.0",
+ "@chakra-ui/react-use-size": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/spinner": {
- "version": "2.0.13",
- "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.0.13.tgz",
- "integrity": "sha512-T1/aSkVpUIuiYyrjfn1+LsQEG7Onbi1UE9ccS/evgf61Dzy4GgTXQUnDuWFSgpV58owqirqOu6jn/9eCwDlzlg==",
- "requires": {
+ "node_modules/@chakra-ui/spinner": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/stat": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.0.18.tgz",
- "integrity": "sha512-wKyfBqhVlIs9bkSerUc6F9KJMw0yTIEKArW7dejWwzToCLPr47u+CtYO6jlJHV6lRvkhi4K4Qc6pyvtJxZ3VpA==",
- "requires": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/stat": {
+ "version": "2.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/stepper": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.2.0.tgz",
- "integrity": "sha512-8ZLxV39oghSVtOUGK8dX8Z6sWVSQiKVmsK4c3OQDa8y2TvxP0VtFD0Z5U1xJlOjQMryZRWhGj9JBc3iQLukuGg==",
- "requires": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/stepper": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/styled-system": {
- "version": "2.9.1",
- "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.1.tgz",
- "integrity": "sha512-jhYKBLxwOPi9/bQt9kqV3ELa/4CjmNNruTyXlPp5M0v0+pDMUngPp48mVLoskm9RKZGE0h1qpvj/jZ3K7c7t8w==",
- "requires": {
+ "node_modules/@chakra-ui/styled-system": {
+ "version": "2.9.2",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5",
- "csstype": "^3.0.11",
+ "csstype": "^3.1.2",
"lodash.mergewith": "4.6.2"
}
},
- "@chakra-ui/switch": {
- "version": "2.0.27",
- "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.0.27.tgz",
- "integrity": "sha512-z76y2fxwMlvRBrC5W8xsZvo3gP+zAEbT3Nqy5P8uh/IPd5OvDsGeac90t5cgnQTyxMOpznUNNK+1eUZqtLxWnQ==",
- "requires": {
- "@chakra-ui/checkbox": "2.2.15",
+ "node_modules/@chakra-ui/switch": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/checkbox": "2.3.2",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/system": {
- "version": "2.5.8",
- "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.5.8.tgz",
- "integrity": "sha512-Vy8UUaCxikOzOGE54IP8tKouvU38rEYU1HCSquU9+oe7Jd70HaiLa4vmUKvHyMUmxkOzDHIkgZLbVQCubSnN5w==",
- "requires": {
- "@chakra-ui/color-mode": "2.1.12",
+ "node_modules/@chakra-ui/system": {
+ "version": "2.6.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/color-mode": "2.2.0",
"@chakra-ui/object-utils": "2.1.0",
"@chakra-ui/react-utils": "2.0.12",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme-utils": "2.0.18",
+ "@chakra-ui/styled-system": "2.9.2",
+ "@chakra-ui/theme-utils": "2.0.21",
"@chakra-ui/utils": "2.0.15",
- "react-fast-compare": "3.2.1"
+ "react-fast-compare": "3.2.2"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0",
+ "@emotion/styled": "^11.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/table": {
- "version": "2.0.17",
- "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.0.17.tgz",
- "integrity": "sha512-OScheTEp1LOYvTki2NFwnAYvac8siAhW9BI5RKm5f5ORL2gVJo4I72RUqE0aKe1oboxgm7CYt5afT5PS5cG61A==",
- "requires": {
- "@chakra-ui/react-context": "2.0.8",
+ "node_modules/@chakra-ui/table": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/react-context": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/tabs": {
- "version": "2.1.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-2.1.9.tgz",
- "integrity": "sha512-Yf8e0kRvaGM6jfkJum0aInQ0U3ZlCafmrYYni2lqjcTtThqu+Yosmo3iYlnullXxCw5MVznfrkb9ySvgQowuYg==",
- "requires": {
- "@chakra-ui/clickable": "2.0.14",
- "@chakra-ui/descendant": "3.0.14",
+ "node_modules/@chakra-ui/tabs": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/clickable": "2.1.0",
+ "@chakra-ui/descendant": "3.1.0",
"@chakra-ui/lazy-utils": "2.0.5",
"@chakra-ui/react-children-utils": "2.0.6",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-controllable-state": "2.0.8",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
- "@chakra-ui/react-use-safe-layout-effect": "2.0.5",
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-controllable-state": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
+ "@chakra-ui/react-use-safe-layout-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/tag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.0.0.tgz",
- "integrity": "sha512-YWdMmw/1OWRwNkG9pX+wVtZio+B89odaPj6XeMn5nfNN8+jyhIEpouWv34+CO9G0m1lupJTxPSfgLAd7cqXZMA==",
- "requires": {
- "@chakra-ui/icon": "3.0.16",
- "@chakra-ui/react-context": "2.0.8"
- }
- },
- "@chakra-ui/textarea": {
- "version": "2.0.19",
- "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.0.19.tgz",
- "integrity": "sha512-adJk+qVGsFeJDvfn56CcJKKse8k7oMGlODrmpnpTdF+xvlsiTM+1GfaJvgNSpHHuQFdz/A0z1uJtfGefk0G2ZA==",
- "requires": {
- "@chakra-ui/form-control": "2.0.18",
+ "node_modules/@chakra-ui/tag": {
+ "version": "3.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/icon": "3.2.0",
+ "@chakra-ui/react-context": "2.1.0"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@chakra-ui/textarea": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/form-control": "2.2.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/theme": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.1.2.tgz",
- "integrity": "sha512-ebUXMS3LZw2OZxEQNYaFw3/XuA3jpyprhS/frjHMvZKSOaCjMW+c9z25S0jp1NnpQff08VGI8EWbyVZECXU1QA==",
- "requires": {
- "@chakra-ui/anatomy": "2.1.2",
+ "node_modules/@chakra-ui/theme": {
+ "version": "3.3.1",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/anatomy": "2.2.2",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/theme-tools": "2.0.18"
+ "@chakra-ui/theme-tools": "2.1.2"
+ },
+ "peerDependencies": {
+ "@chakra-ui/styled-system": ">=2.8.0"
}
},
- "@chakra-ui/theme-tools": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.0.18.tgz",
- "integrity": "sha512-MbiRuXb2tb41FbnW41zhsYYAU0znlpfYZnu0mxCf8U2otCwPekJCfESUGYypjq4JnydQ7TDOk+Kz/Wi974l4mw==",
- "requires": {
- "@chakra-ui/anatomy": "2.1.2",
+ "node_modules/@chakra-ui/theme-tools": {
+ "version": "2.1.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/anatomy": "2.2.2",
"@chakra-ui/shared-utils": "2.0.5",
- "color2k": "^2.0.0"
+ "color2k": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@chakra-ui/styled-system": ">=2.0.0"
}
},
- "@chakra-ui/theme-utils": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.18.tgz",
- "integrity": "sha512-aSbkUUiFpc1NHC7lQdA6uYlr6EcZFXz6b4aJ7VRDpqTiywvqYnvfGzhmsB0z94vgtS9qXc6HoIwBp25jYGV2MA==",
- "requires": {
+ "node_modules/@chakra-ui/theme-utils": {
+ "version": "2.0.21",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme": "3.1.2",
+ "@chakra-ui/styled-system": "2.9.2",
+ "@chakra-ui/theme": "3.3.1",
"lodash.mergewith": "4.6.2"
}
},
- "@chakra-ui/toast": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-6.1.4.tgz",
- "integrity": "sha512-wAcPHq/N/ar4jQxkUGhnsbp+lx2eKOpHxn1KaWdHXUkqCNUA1z09fvBsoMyzObSiiwbDuQPZG5RxsOhzfPZX4Q==",
- "requires": {
- "@chakra-ui/alert": "2.1.0",
- "@chakra-ui/close-button": "2.0.17",
- "@chakra-ui/portal": "2.0.16",
- "@chakra-ui/react-context": "2.0.8",
- "@chakra-ui/react-use-timeout": "2.0.5",
- "@chakra-ui/react-use-update-effect": "2.0.7",
+ "node_modules/@chakra-ui/toast": {
+ "version": "7.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@chakra-ui/alert": "2.2.2",
+ "@chakra-ui/close-button": "2.1.1",
+ "@chakra-ui/portal": "2.1.0",
+ "@chakra-ui/react-context": "2.1.0",
+ "@chakra-ui/react-use-timeout": "2.1.0",
+ "@chakra-ui/react-use-update-effect": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5",
- "@chakra-ui/styled-system": "2.9.1",
- "@chakra-ui/theme": "3.1.2"
+ "@chakra-ui/styled-system": "2.9.2",
+ "@chakra-ui/theme": "3.3.1"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": "2.6.2",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "@chakra-ui/tooltip": {
- "version": "2.2.9",
- "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.2.9.tgz",
- "integrity": "sha512-ZoksllanqXRUyMDaiogvUVJ+RdFXwZrfrwx3RV22fejYZIQ602hZ3QHtHLB5ZnKFLbvXKMZKM23HxFTSb0Ytqg==",
- "requires": {
+ "node_modules/@chakra-ui/tooltip": {
+ "version": "2.3.1",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/dom-utils": "2.1.0",
- "@chakra-ui/popper": "3.0.14",
- "@chakra-ui/portal": "2.0.16",
+ "@chakra-ui/popper": "3.1.0",
+ "@chakra-ui/portal": "2.1.0",
"@chakra-ui/react-types": "2.0.7",
- "@chakra-ui/react-use-disclosure": "2.0.8",
- "@chakra-ui/react-use-event-listener": "2.0.7",
- "@chakra-ui/react-use-merge-refs": "2.0.7",
+ "@chakra-ui/react-use-disclosure": "2.1.0",
+ "@chakra-ui/react-use-event-listener": "2.1.0",
+ "@chakra-ui/react-use-merge-refs": "2.1.0",
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "framer-motion": ">=4.0.0",
+ "react": ">=18",
+ "react-dom": ">=18"
}
},
- "@chakra-ui/transition": {
- "version": "2.0.16",
- "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.0.16.tgz",
- "integrity": "sha512-E+RkwlPc3H7P1crEXmXwDXMB2lqY2LLia2P5siQ4IEnRWIgZXlIw+8Em+NtHNgusel2N+9yuB0wT9SeZZeZ3CQ==",
- "requires": {
+ "node_modules/@chakra-ui/transition": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
"@chakra-ui/shared-utils": "2.0.5"
+ },
+ "peerDependencies": {
+ "framer-motion": ">=4.0.0",
+ "react": ">=18"
}
},
- "@chakra-ui/utils": {
+ "node_modules/@chakra-ui/utils": {
"version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz",
- "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@types/lodash.mergewith": "4.6.7",
"css-box-model": "1.2.1",
"framesync": "6.1.2",
"lodash.mergewith": "4.6.2"
}
},
- "@chakra-ui/visually-hidden": {
- "version": "2.0.15",
- "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.0.15.tgz",
- "integrity": "sha512-WWULIiucYRBIewHKFA7BssQ2ABLHLVd9lrUo3N3SZgR0u4ZRDDVEUNOy+r+9ruDze8+36dGbN9wsN1IdELtdOw==",
- "requires": {}
- },
- "@emotion/babel-plugin": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz",
- "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==",
- "requires": {
+ "node_modules/@chakra-ui/visually-hidden": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "@chakra-ui/system": ">=2.0.0",
+ "react": ">=18"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.12.0",
+ "license": "MIT",
+ "dependencies": {
"@babel/helper-module-imports": "^7.16.7",
"@babel/runtime": "^7.18.3",
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/serialize": "^1.1.2",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.2.0",
"babel-plugin-macros": "^3.1.0",
"convert-source-map": "^1.5.0",
"escape-string-regexp": "^4.0.0",
"find-root": "^1.1.0",
"source-map": "^0.5.7",
"stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
},
- "dependencies": {
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
- }
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "@emotion/cache": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz",
- "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==",
- "requires": {
- "@emotion/memoize": "^0.8.1",
- "@emotion/sheet": "^1.2.2",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
+ "node_modules/@emotion/cache": {
+ "version": "11.13.1",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.0",
+ "@emotion/weak-memoize": "^0.4.0",
"stylis": "4.2.0"
}
},
- "@emotion/hash": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz",
- "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ=="
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "license": "MIT"
},
- "@emotion/is-prop-valid": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
- "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
- "requires": {
- "@emotion/memoize": "^0.8.1"
- }
- },
- "@emotion/memoize": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz",
- "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA=="
- },
- "@emotion/react": {
- "version": "11.11.1",
- "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz",
- "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==",
- "requires": {
+ "node_modules/@emotion/react": {
+ "version": "11.13.0",
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/cache": "^11.11.0",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1",
- "@emotion/weak-memoize": "^0.3.1",
+ "@emotion/babel-plugin": "^11.12.0",
+ "@emotion/cache": "^11.13.0",
+ "@emotion/serialize": "^1.3.0",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+ "@emotion/utils": "^1.4.0",
+ "@emotion/weak-memoize": "^0.4.0",
"hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "@emotion/serialize": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz",
- "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==",
- "requires": {
- "@emotion/hash": "^0.9.1",
- "@emotion/memoize": "^0.8.1",
- "@emotion/unitless": "^0.8.1",
- "@emotion/utils": "^1.2.1",
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.9.0",
+ "@emotion/utils": "^1.4.0",
"csstype": "^3.0.2"
}
},
- "@emotion/sheet": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz",
- "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA=="
- },
- "@emotion/styled": {
- "version": "11.11.0",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz",
- "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==",
- "requires": {
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.13.0",
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.18.3",
- "@emotion/babel-plugin": "^11.11.0",
- "@emotion/is-prop-valid": "^1.2.1",
- "@emotion/serialize": "^1.1.2",
- "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1",
- "@emotion/utils": "^1.2.1"
+ "@emotion/babel-plugin": "^11.12.0",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.0",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+ "@emotion/utils": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "@emotion/unitless": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz",
- "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ=="
- },
- "@emotion/use-insertion-effect-with-fallbacks": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz",
- "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==",
- "requires": {}
- },
- "@emotion/utils": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz",
- "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg=="
- },
- "@emotion/weak-memoize": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz",
- "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww=="
- },
- "@esbuild/android-arm": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.13.tgz",
- "integrity": "sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.13.tgz",
- "integrity": "sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/android-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.13.tgz",
- "integrity": "sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.13.tgz",
- "integrity": "sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/darwin-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.13.tgz",
- "integrity": "sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.13.tgz",
- "integrity": "sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/freebsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.13.tgz",
- "integrity": "sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.13.tgz",
- "integrity": "sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.13.tgz",
- "integrity": "sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ia32": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.13.tgz",
- "integrity": "sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-loong64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.13.tgz",
- "integrity": "sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-mips64el": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.13.tgz",
- "integrity": "sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-ppc64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.13.tgz",
- "integrity": "sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-riscv64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.13.tgz",
- "integrity": "sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-s390x": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.13.tgz",
- "integrity": "sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/linux-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.13.tgz",
- "integrity": "sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA==",
- "dev": true,
- "optional": true
- },
- "@esbuild/netbsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.13.tgz",
- "integrity": "sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ==",
- "dev": true,
- "optional": true
- },
- "@esbuild/openbsd-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.13.tgz",
- "integrity": "sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g==",
- "dev": true,
- "optional": true
+ "node_modules/@emotion/unitless": {
+ "version": "0.9.0",
+ "license": "MIT"
},
- "@esbuild/sunos-x64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.13.tgz",
- "integrity": "sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw==",
- "dev": true,
- "optional": true
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
},
- "@esbuild/win32-arm64": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.13.tgz",
- "integrity": "sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw==",
- "dev": true,
- "optional": true
+ "node_modules/@emotion/utils": {
+ "version": "1.4.0",
+ "license": "MIT"
},
- "@esbuild/win32-ia32": {
- "version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.13.tgz",
- "integrity": "sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg==",
- "dev": true,
- "optional": true
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "license": "MIT"
},
- "@esbuild/win32-x64": {
+ "node_modules/@esbuild/darwin-x64": {
"version": "0.18.13",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.13.tgz",
- "integrity": "sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "optional": true
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
},
- "@eslint-community/eslint-utils": {
+ "node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
- "@eslint-community/regexpp": {
+ "node_modules/@eslint-community/regexpp": {
"version": "4.5.1",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
- "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
},
- "@eslint/eslintrc": {
+ "node_modules/@eslint/eslintrc": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
- "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"ajv": "^6.12.4",
"debug": "^4.3.2",
"espree": "^9.6.0",
@@ -6881,313 +3167,370 @@
"minimatch": "^3.1.2",
"strip-json-comments": "^3.1.1"
},
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- }
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "@eslint/js": {
+ "node_modules/@eslint/js": {
"version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
- "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
},
- "@humanwhocodes/config-array": {
+ "node_modules/@humanwhocodes/config-array": {
"version": "0.11.10",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
- "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
"dev": true,
- "requires": {
+ "license": "Apache-2.0",
+ "dependencies": {
"@humanwhocodes/object-schema": "^1.2.1",
"debug": "^4.1.1",
"minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
}
},
- "@humanwhocodes/module-importer": {
+ "node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
},
- "@humanwhocodes/object-schema": {
+ "node_modules/@humanwhocodes/object-schema": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
- "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
- "dev": true
+ "dev": true,
+ "license": "BSD-3-Clause"
},
- "@jridgewell/gen-mapping": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
- "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
"dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/set-array": "^1.2.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "@jridgewell/resolve-uri": {
+ "node_modules/@jridgewell/resolve-uri": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
- "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "@jridgewell/set-array": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
- "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
- "dev": true
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "@jridgewell/sourcemap-codec": {
+ "node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "@jridgewell/trace-mapping": {
- "version": "0.3.18",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
- "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
"dev": true,
- "requires": {
- "@jridgewell/resolve-uri": "3.1.0",
- "@jridgewell/sourcemap-codec": "1.4.14"
- },
+ "license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": {
- "version": "1.4.14",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
- "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
- "dev": true
- }
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "@nodelib/fs.scandir": {
+ "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@nodelib/fs.stat": "2.0.5",
"run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@nodelib/fs.stat": {
+ "node_modules/@nodelib/fs.stat": {
"version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
},
- "@nodelib/fs.walk": {
+ "node_modules/@nodelib/fs.walk": {
"version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@nodelib/fs.scandir": "2.1.5",
"fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@popperjs/core": {
+ "node_modules/@popperjs/core": {
"version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
},
- "@remix-run/router": {
+ "node_modules/@remix-run/router": {
"version": "1.7.1",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz",
- "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
},
- "@socket.io/component-emitter": {
+ "node_modules/@socket.io/component-emitter": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
- "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
+ "license": "MIT"
},
- "@types/lodash": {
+ "node_modules/@types/lodash": {
"version": "4.14.195",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz",
- "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg=="
+ "license": "MIT"
},
- "@types/lodash.mergewith": {
+ "node_modules/@types/lodash.mergewith": {
"version": "4.6.7",
- "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz",
- "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@types/lodash": "*"
}
},
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "license": "MIT"
},
- "@types/prop-types": {
+ "node_modules/@types/prop-types": {
"version": "15.7.5",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
- "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
- "devOptional": true
+ "devOptional": true,
+ "license": "MIT"
},
- "@types/react": {
+ "node_modules/@types/react": {
"version": "18.2.15",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz",
- "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==",
"devOptional": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@types/prop-types": "*",
"@types/scheduler": "*",
"csstype": "^3.0.2"
}
},
- "@types/react-dom": {
+ "node_modules/@types/react-dom": {
"version": "18.2.7",
- "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz",
- "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@types/react": "*"
}
},
- "@types/scheduler": {
+ "node_modules/@types/scheduler": {
"version": "0.16.3",
- "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
- "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
- "devOptional": true
+ "devOptional": true,
+ "license": "MIT"
},
- "@vitejs/plugin-react": {
+ "node_modules/@vitejs/plugin-react": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz",
- "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/core": "^7.22.5",
"@babel/plugin-transform-react-jsx-self": "^7.22.5",
"@babel/plugin-transform-react-jsx-source": "^7.22.5",
"react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0"
}
},
- "@zag-js/element-size": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.3.2.tgz",
- "integrity": "sha512-bVvvigUGvAuj7PCkE5AbzvTJDTw5f3bg9nQdv+ErhVN8SfPPppLJEmmWdxqsRzrHXgx8ypJt/+Ty0kjtISVDsQ=="
+ "node_modules/@zag-js/dom-query": {
+ "version": "0.16.0",
+ "license": "MIT"
+ },
+ "node_modules/@zag-js/element-size": {
+ "version": "0.10.5",
+ "license": "MIT"
},
- "@zag-js/focus-visible": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.2.2.tgz",
- "integrity": "sha512-0j2gZq8HiZ51z4zNnSkF1iSkqlwRDvdH+son3wHdoz+7IUdMN/5Exd4TxMJ+gq2Of1DiXReYLL9qqh2PdQ4wgA=="
+ "node_modules/@zag-js/focus-visible": {
+ "version": "0.16.0",
+ "license": "MIT",
+ "dependencies": {
+ "@zag-js/dom-query": "0.16.0"
+ }
},
- "acorn": {
+ "node_modules/acorn": {
"version": "8.10.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
- "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "acorn-jsx": {
+ "node_modules/acorn-jsx": {
"version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
- "requires": {}
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
},
- "ajv": {
+ "node_modules/ajv": {
"version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
"json-schema-traverse": "^0.4.1",
"uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "ansi-regex": {
+ "node_modules/ansi-regex": {
"version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "ansi-styles": {
+ "node_modules/ansi-styles": {
"version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "argparse": {
+ "node_modules/argparse": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true
+ "dev": true,
+ "license": "Python-2.0"
},
- "aria-hidden": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz",
- "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==",
- "requires": {
+ "node_modules/aria-hidden": {
+ "version": "1.2.4",
+ "license": "MIT",
+ "dependencies": {
"tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "array-buffer-byte-length": {
+ "node_modules/array-buffer-byte-length": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "array-includes": {
+ "node_modules/array-includes": {
"version": "3.1.6",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz",
- "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4",
"get-intrinsic": "^1.1.3",
"is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "array.prototype.flat": {
+ "node_modules/array.prototype.flat": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz",
- "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4",
"es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "array.prototype.flatmap": {
+ "node_modules/array.prototype.flatmap": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz",
- "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4",
"es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "array.prototype.tosorted": {
+ "node_modules/array.prototype.tosorted": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz",
- "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4",
@@ -7195,268 +3538,316 @@
"get-intrinsic": "^1.1.3"
}
},
- "available-typed-arrays": {
+ "node_modules/available-typed-arrays": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "babel-plugin-macros": {
+ "node_modules/babel-plugin-macros": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
- "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.12.5",
"cosmiconfig": "^7.0.0",
"resolve": "^1.19.0"
},
- "dependencies": {
- "resolve": {
- "version": "1.22.2",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
- "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
- "requires": {
- "is-core-module": "^2.11.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- }
- }
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
}
},
- "backend": {
- "version": "file:..",
- "requires": {
- "bcryptjs": "^2.4.3",
- "cloudinary": "^1.40.0",
- "cookie-parser": "^1.4.6",
- "dotenv": "^16.3.1",
- "express": "^4.18.2",
- "jsonwebtoken": "^9.0.1",
- "mongoose": "^7.4.0",
- "nodemon": "^3.0.1",
- "socket.io": "^4.7.2"
+ "node_modules/babel-plugin-macros/node_modules/resolve": {
+ "version": "1.22.8",
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "balanced-match": {
+ "node_modules/backend": {
+ "resolved": "..",
+ "link": true
+ },
+ "node_modules/balanced-match": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "brace-expansion": {
+ "node_modules/brace-expansion": {
"version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
}
},
- "browserslist": {
+ "node_modules/browserslist": {
"version": "4.21.9",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
- "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
"dev": true,
- "requires": {
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
"caniuse-lite": "^1.0.30001503",
"electron-to-chromium": "^1.4.431",
"node-releases": "^2.0.12",
"update-browserslist-db": "^1.0.11"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "call-bind": {
+ "node_modules/call-bind": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "callsites": {
+ "node_modules/callsites": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "caniuse-lite": {
+ "node_modules/caniuse-lite": {
"version": "1.0.30001516",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz",
- "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==",
- "dev": true
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
},
- "chalk": {
+ "node_modules/chalk": {
"version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "color-convert": {
+ "node_modules/color-convert": {
"version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"color-name": "1.1.3"
}
},
- "color-name": {
+ "node_modules/color-name": {
"version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ "license": "MIT"
},
- "color2k": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.2.tgz",
- "integrity": "sha512-kJhwH5nAwb34tmyuqq/lgjEKzlFXn1U99NlnB6Ws4qVaERcRUYeYP1cBw6BJ4vxaWStAUEef4WMr7WjOCnBt8w=="
+ "node_modules/color2k": {
+ "version": "2.0.3",
+ "license": "MIT"
},
- "compute-scroll-into-view": {
- "version": "1.0.20",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
- "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.0.3",
+ "license": "MIT"
},
- "concat-map": {
+ "node_modules/concat-map": {
"version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "convert-source-map": {
+ "node_modules/convert-source-map": {
"version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ "license": "MIT"
},
- "copy-to-clipboard": {
+ "node_modules/copy-to-clipboard": {
"version": "3.3.3",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
- "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"toggle-selection": "^1.0.6"
}
},
- "cosmiconfig": {
+ "node_modules/cosmiconfig": {
"version": "7.1.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
- "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@types/parse-json": "^4.0.0",
"import-fresh": "^3.2.1",
"parse-json": "^5.0.0",
"path-type": "^4.0.0",
"yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "cross-spawn": {
+ "node_modules/cross-spawn": {
"version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"path-key": "^3.1.0",
"shebang-command": "^2.0.0",
"which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "css-box-model": {
+ "node_modules/css-box-model": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz",
- "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"tiny-invariant": "^1.0.6"
}
},
- "csstype": {
+ "node_modules/csstype": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
- "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+ "license": "MIT"
},
- "date-fns": {
+ "node_modules/date-fns": {
"version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
}
},
- "debug": {
+ "node_modules/debug": {
"version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "deep-is": {
+ "node_modules/deep-is": {
"version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "define-properties": {
+ "node_modules/define-properties": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz",
- "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-property-descriptors": "^1.0.0",
"object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "detect-node-es": {
+ "node_modules/detect-node-es": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
- "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ "license": "MIT"
},
- "doctrine": {
+ "node_modules/doctrine": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
"dev": true,
- "requires": {
+ "license": "Apache-2.0",
+ "dependencies": {
"esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "electron-to-chromium": {
+ "node_modules/electron-to-chromium": {
"version": "1.4.461",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz",
- "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==",
- "dev": true
- },
- "engine.io-client": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz",
- "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==",
- "requires": {
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/engine.io-client": {
+ "version": "6.5.4",
+ "license": "MIT",
+ "dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1",
"engine.io-parser": "~5.2.1",
- "ws": "~8.11.0",
+ "ws": "~8.17.1",
"xmlhttprequest-ssl": "~2.0.0"
}
},
- "engine.io-parser": {
+ "node_modules/engine.io-parser": {
"version": "5.2.1",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
- "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
},
- "error-ex": {
+ "node_modules/error-ex": {
"version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-arrayish": "^0.2.1"
}
},
- "es-abstract": {
+ "node_modules/es-abstract": {
"version": "1.21.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz",
- "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"array-buffer-byte-length": "^1.0.0",
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
@@ -7492,45 +3883,63 @@
"typed-array-length": "^1.0.4",
"unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "es-set-tostringtag": {
+ "node_modules/es-set-tostringtag": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
- "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"get-intrinsic": "^1.1.3",
"has": "^1.0.3",
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "es-shim-unscopables": {
+ "node_modules/es-shim-unscopables": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
- "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has": "^1.0.3"
}
},
- "es-to-primitive": {
+ "node_modules/es-to-primitive": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "esbuild": {
+ "node_modules/esbuild": {
"version": "0.18.13",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.13.tgz",
- "integrity": "sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw==",
"dev": true,
- "requires": {
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
"@esbuild/android-arm": "0.18.13",
"@esbuild/android-arm64": "0.18.13",
"@esbuild/android-x64": "0.18.13",
@@ -7555,23 +3964,26 @@
"@esbuild/win32-x64": "0.18.13"
}
},
- "escalade": {
+ "node_modules/escalade": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "escape-string-regexp": {
+ "node_modules/escape-string-regexp": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
},
- "eslint": {
+ "node_modules/eslint": {
"version": "8.45.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
- "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.1.0",
@@ -7610,79 +4022,21 @@
"strip-ansi": "^6.0.1",
"text-table": "^0.2.0"
},
- "dependencies": {
- "ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "requires": {
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true
- },
- "globals": {
- "version": "13.20.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
- "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
- "dev": true,
- "requires": {
- "type-fest": "^0.20.2"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true
- },
- "supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "eslint-plugin-react": {
+ "node_modules/eslint-plugin-react": {
"version": "7.32.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz",
- "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"array-includes": "^3.1.6",
"array.prototype.flatmap": "^1.3.1",
"array.prototype.tosorted": "^1.1.1",
@@ -7699,1226 +4053,1727 @@
"semver": "^6.3.0",
"string.prototype.matchall": "^4.0.8"
},
- "dependencies": {
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- }
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
- "eslint-plugin-react-hooks": {
+ "node_modules/eslint-plugin-react-hooks": {
"version": "4.6.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
- "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
"dev": true,
- "requires": {}
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
},
- "eslint-plugin-react-refresh": {
+ "node_modules/eslint-plugin-react-refresh": {
"version": "0.4.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz",
- "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==",
"dev": true,
- "requires": {}
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "eslint-scope": {
+ "node_modules/eslint-scope": {
"version": "7.2.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
- "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
"dev": true,
- "requires": {
+ "license": "BSD-2-Clause",
+ "dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "eslint-visitor-keys": {
+ "node_modules/eslint-visitor-keys": {
"version": "3.4.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
- "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
- "dev": true
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "espree": {
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
"version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
"dev": true,
- "requires": {
+ "license": "BSD-2-Clause",
+ "dependencies": {
"acorn": "^8.9.0",
"acorn-jsx": "^5.3.2",
"eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "esquery": {
+ "node_modules/esquery": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
"dev": true,
- "requires": {
+ "license": "BSD-3-Clause",
+ "dependencies": {
"estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
- "esrecurse": {
+ "node_modules/esrecurse": {
"version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
- "requires": {
+ "license": "BSD-2-Clause",
+ "dependencies": {
"estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
}
},
- "estraverse": {
+ "node_modules/estraverse": {
"version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
},
- "esutils": {
+ "node_modules/esutils": {
"version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "fast-deep-equal": {
+ "node_modules/fast-deep-equal": {
"version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "fast-json-stable-stringify": {
+ "node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "fast-levenshtein": {
+ "node_modules/fast-levenshtein": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "fastq": {
+ "node_modules/fastq": {
"version": "1.15.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
- "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"reusify": "^1.0.4"
}
},
- "file-entry-cache": {
+ "node_modules/file-entry-cache": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "find-root": {
+ "node_modules/find-root": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ "license": "MIT"
},
- "find-up": {
+ "node_modules/find-up": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"locate-path": "^6.0.0",
"path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "flat-cache": {
+ "node_modules/flat-cache": {
"version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"flatted": "^3.1.0",
"rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
}
},
- "flatted": {
+ "node_modules/flatted": {
"version": "3.2.7",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
- "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
- "dev": true
- },
- "focus-lock": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-0.11.6.tgz",
- "integrity": "sha512-KSuV3ur4gf2KqMNoZx3nXNVhqCkn42GuTYCX4tXPEwf0MjpFQmNMiN6m7dXaUXgIoivL6/65agoUMg4RLS0Vbg==",
- "requires": {
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/focus-lock": {
+ "version": "1.3.5",
+ "license": "MIT",
+ "dependencies": {
"tslib": "^2.0.3"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "for-each": {
+ "node_modules/for-each": {
"version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-callable": "^1.1.3"
}
},
- "framer-motion": {
- "version": "10.12.21",
- "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.21.tgz",
- "integrity": "sha512-EmnP73O5+1OGm2jtQNoBPPuAJvhySl+p4/9PL7PPJHt58nkPWeFaxhCJaUDXDf6N3jSLluefxopc0FrMCQ+/tQ==",
- "requires": {
- "@emotion/is-prop-valid": "^0.8.2",
+ "node_modules/framer-motion": {
+ "version": "10.18.0",
+ "license": "MIT",
+ "dependencies": {
"tslib": "^2.4.0"
},
- "dependencies": {
- "@emotion/is-prop-valid": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
- "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
- "optional": true,
- "requires": {
- "@emotion/memoize": "0.7.4"
- }
+ "optionalDependencies": {
+ "@emotion/is-prop-valid": "^0.8.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
},
- "@emotion/memoize": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
- "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+ "react-dom": {
"optional": true
}
}
},
- "framesync": {
+ "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": {
+ "version": "0.8.8",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emotion/memoize": "0.7.4"
+ }
+ },
+ "node_modules/framer-motion/node_modules/@emotion/memoize": {
+ "version": "0.7.4",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/framesync": {
"version": "6.1.2",
- "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz",
- "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==",
- "requires": {
- "tslib": "2.4.0"
- },
+ "license": "MIT",
"dependencies": {
- "tslib": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
- "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- }
+ "tslib": "2.4.0"
}
},
- "fs.realpath": {
+ "node_modules/framesync/node_modules/tslib": {
+ "version": "2.4.0",
+ "license": "0BSD"
+ },
+ "node_modules/fs.realpath": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
- "fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "node_modules/fsevents": {
+ "version": "2.3.3",
"dev": true,
- "optional": true
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
},
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "function.prototype.name": {
+ "node_modules/function.prototype.name": {
"version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.19.0",
"functions-have-names": "^1.2.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "functions-have-names": {
+ "node_modules/functions-have-names": {
"version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "gensync": {
+ "node_modules/gensync": {
"version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
},
- "get-intrinsic": {
+ "node_modules/get-intrinsic": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
- "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "get-nonce": {
+ "node_modules/get-nonce": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
- "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "get-symbol-description": {
+ "node_modules/get-symbol-description": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "glob": {
+ "node_modules/glob": {
"version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
"inherits": "2",
"minimatch": "^3.1.1",
"once": "^1.3.0",
"path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "glob-parent": {
+ "node_modules/glob-parent": {
"version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
}
},
- "globals": {
+ "node_modules/globals": {
"version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "globalthis": {
+ "node_modules/globalthis": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "gopd": {
+ "node_modules/gopd": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "graphemer": {
+ "node_modules/graphemer": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "hamt_plus": {
+ "node_modules/hamt_plus": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/hamt_plus/-/hamt_plus-1.0.2.tgz",
- "integrity": "sha512-t2JXKaehnMb9paaYA7J0BX8QQAY8lwfQ9Gjf4pg/mk4krt+cmwmU652HOoWonf+7+EQV97ARPMhhVgU1ra2GhA=="
+ "license": "MIT"
},
- "has": {
+ "node_modules/has": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
"function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "has-bigints": {
+ "node_modules/has-bigints": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "has-flag": {
+ "node_modules/has-flag": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "has-property-descriptors": {
+ "node_modules/has-property-descriptors": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "has-proto": {
+ "node_modules/has-proto": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "has-symbols": {
+ "node_modules/has-symbols": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "has-tostringtag": {
+ "node_modules/has-tostringtag": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "hoist-non-react-statics": {
+ "node_modules/hoist-non-react-statics": {
"version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "requires": {
+ "license": "BSD-3-Clause",
+ "dependencies": {
"react-is": "^16.7.0"
}
},
- "ignore": {
+ "node_modules/ignore": {
"version": "5.2.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
- "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
},
- "import-fresh": {
+ "node_modules/import-fresh": {
"version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"parent-module": "^1.0.0",
"resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "imurmurhash": {
+ "node_modules/imurmurhash": {
"version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
},
- "inflight": {
+ "node_modules/inflight": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"once": "^1.3.0",
"wrappy": "1"
}
},
- "inherits": {
+ "node_modules/inherits": {
"version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
- "internal-slot": {
+ "node_modules/internal-slot": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
- "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"get-intrinsic": "^1.2.0",
"has": "^1.0.3",
"side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "invariant": {
+ "node_modules/invariant": {
"version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"loose-envify": "^1.0.0"
}
},
- "is-array-buffer": {
+ "node_modules/is-array-buffer": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.0",
"is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-arrayish": {
+ "node_modules/is-arrayish": {
"version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ "license": "MIT"
},
- "is-bigint": {
+ "node_modules/is-bigint": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-boolean-object": {
+ "node_modules/is-boolean-object": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-callable": {
+ "node_modules/is-callable": {
"version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "is-core-module": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
- "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
- "requires": {
- "has": "^1.0.3"
+ "node_modules/is-core-module": {
+ "version": "2.15.0",
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-date-object": {
+ "node_modules/is-date-object": {
"version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-extglob": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-glob": {
+ "node_modules/is-glob": {
"version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-negative-zero": {
+ "node_modules/is-negative-zero": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "is-number-object": {
+ "node_modules/is-number-object": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-path-inside": {
+ "node_modules/is-path-inside": {
"version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-regex": {
+ "node_modules/is-regex": {
"version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-shared-array-buffer": {
+ "node_modules/is-shared-array-buffer": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-string": {
+ "node_modules/is-string": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-symbol": {
+ "node_modules/is-symbol": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-typed-array": {
+ "node_modules/is-typed-array": {
"version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
"has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "is-weakref": {
+ "node_modules/is-weakref": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "isexe": {
+ "node_modules/isexe": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
- "js-tokens": {
+ "node_modules/js-tokens": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ "license": "MIT"
},
- "js-yaml": {
+ "node_modules/js-yaml": {
"version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "jsesc": {
+ "node_modules/jsesc": {
"version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "json-parse-even-better-errors": {
+ "node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ "license": "MIT"
},
- "json-schema-traverse": {
+ "node_modules/json-schema-traverse": {
"version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "json-stable-stringify-without-jsonify": {
+ "node_modules/json-stable-stringify-without-jsonify": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "json5": {
+ "node_modules/json5": {
"version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "jsx-ast-utils": {
+ "node_modules/jsx-ast-utils": {
"version": "3.3.4",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz",
- "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"array-includes": "^3.1.6",
"array.prototype.flat": "^1.3.1",
"object.assign": "^4.1.4",
"object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
}
},
- "levn": {
+ "node_modules/levn": {
"version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"prelude-ls": "^1.2.1",
"type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "lines-and-columns": {
+ "node_modules/lines-and-columns": {
"version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ "license": "MIT"
},
- "locate-path": {
+ "node_modules/locate-path": {
"version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "lodash.merge": {
+ "node_modules/lodash.merge": {
"version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "lodash.mergewith": {
+ "node_modules/lodash.mergewith": {
"version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
- "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
+ "license": "MIT"
},
- "loose-envify": {
+ "node_modules/loose-envify": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
}
},
- "lru-cache": {
+ "node_modules/lru-cache": {
"version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"yallist": "^3.0.2"
}
},
- "minimatch": {
+ "node_modules/minimatch": {
"version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "ms": {
+ "node_modules/ms": {
"version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "license": "MIT"
},
- "nanoid": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
- "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
- "dev": true
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
},
- "natural-compare": {
+ "node_modules/natural-compare": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "node-releases": {
+ "node_modules/node-releases": {
"version": "2.0.13",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
- "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "object-assign": {
+ "node_modules/object-assign": {
"version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "object-inspect": {
+ "node_modules/object-inspect": {
"version": "1.12.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
- "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "object-keys": {
+ "node_modules/object-keys": {
"version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
},
- "object.assign": {
+ "node_modules/object.assign": {
"version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"has-symbols": "^1.0.3",
"object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "object.entries": {
+ "node_modules/object.entries": {
"version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz",
- "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
}
},
- "object.fromentries": {
+ "node_modules/object.fromentries": {
"version": "2.0.6",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz",
- "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "object.hasown": {
+ "node_modules/object.hasown": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz",
- "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "object.values": {
+ "node_modules/object.values": {
"version": "1.1.6",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz",
- "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "once": {
+ "node_modules/once": {
"version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"wrappy": "1"
}
},
- "optionator": {
+ "node_modules/optionator": {
"version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
"type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "p-limit": {
+ "node_modules/p-limit": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "p-locate": {
+ "node_modules/p-locate": {
"version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "parent-module": {
+ "node_modules/parent-module": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "parse-json": {
+ "node_modules/parse-json": {
"version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/code-frame": "^7.0.0",
"error-ex": "^1.3.1",
"json-parse-even-better-errors": "^2.3.0",
"lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "path-exists": {
+ "node_modules/path-exists": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-is-absolute": {
+ "node_modules/path-is-absolute": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "path-key": {
+ "node_modules/path-key": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "path-parse": {
+ "node_modules/path-parse": {
"version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ "license": "MIT"
},
- "path-type": {
+ "node_modules/path-type": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "picocolors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
- "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
- "dev": true
+ "node_modules/picocolors": {
+ "version": "1.0.1",
+ "license": "ISC"
},
- "postcss": {
- "version": "8.4.26",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz",
- "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==",
+ "node_modules/postcss": {
+ "version": "8.4.41",
"dev": true,
- "requires": {
- "nanoid": "^3.3.6",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.0.2"
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.0.1",
+ "source-map-js": "^1.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
}
},
- "prelude-ls": {
+ "node_modules/prelude-ls": {
"version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
},
- "prop-types": {
+ "node_modules/prop-types": {
"version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.13.1"
}
},
- "punycode": {
+ "node_modules/punycode": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
- "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
},
- "queue-microtask": {
+ "node_modules/queue-microtask": {
"version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
},
- "react": {
+ "node_modules/react": {
"version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "react-clientside-effect": {
+ "node_modules/react-clientside-effect": {
"version": "1.2.6",
- "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz",
- "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.12.13"
+ },
+ "peerDependencies": {
+ "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
}
},
- "react-dom": {
+ "node_modules/react-dom": {
"version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
}
},
- "react-fast-compare": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz",
- "integrity": "sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg=="
- },
- "react-focus-lock": {
- "version": "2.9.5",
- "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.9.5.tgz",
- "integrity": "sha512-h6vrdgUbsH2HeD5I7I3Cx1PPrmwGuKYICS+kB9m+32X/9xHRrAbxgvaBpG7BFBN9h3tO+C3qX1QAVESmi4CiIA==",
- "requires": {
+ "node_modules/react-fast-compare": {
+ "version": "3.2.2",
+ "license": "MIT"
+ },
+ "node_modules/react-focus-lock": {
+ "version": "2.12.1",
+ "license": "MIT",
+ "dependencies": {
"@babel/runtime": "^7.0.0",
- "focus-lock": "^0.11.6",
+ "focus-lock": "^1.3.5",
"prop-types": "^15.6.2",
"react-clientside-effect": "^1.2.6",
- "use-callback-ref": "^1.3.0",
+ "use-callback-ref": "^1.3.2",
"use-sidecar": "^1.1.2"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "react-icons": {
+ "node_modules/react-icons": {
"version": "4.10.1",
- "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.10.1.tgz",
- "integrity": "sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw==",
- "requires": {}
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "*"
+ }
},
- "react-is": {
+ "node_modules/react-is": {
"version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ "license": "MIT"
},
- "react-refresh": {
+ "node_modules/react-refresh": {
"version": "0.14.0",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
- "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
- "dev": true
- },
- "react-remove-scroll": {
- "version": "2.5.6",
- "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz",
- "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==",
- "requires": {
- "react-remove-scroll-bar": "^2.3.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.5.10",
+ "license": "MIT",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.6",
"react-style-singleton": "^2.2.1",
"tslib": "^2.1.0",
"use-callback-ref": "^1.3.0",
"use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "react-remove-scroll-bar": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz",
- "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==",
- "requires": {
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.6",
+ "license": "MIT",
+ "dependencies": {
"react-style-singleton": "^2.2.1",
"tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "react-router": {
+ "node_modules/react-router": {
"version": "6.14.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz",
- "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@remix-run/router": "1.7.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8"
}
},
- "react-router-dom": {
+ "node_modules/react-router-dom": {
"version": "6.14.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz",
- "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@remix-run/router": "1.7.1",
"react-router": "6.14.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "react": ">=16.8",
+ "react-dom": ">=16.8"
}
},
- "react-style-singleton": {
+ "node_modules/react-style-singleton": {
"version": "2.2.1",
- "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
- "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"get-nonce": "^1.0.0",
"invariant": "^2.2.4",
"tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "recoil": {
+ "node_modules/recoil": {
"version": "0.7.7",
- "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz",
- "integrity": "sha512-8Og5KPQW9LwC577Vc7Ug2P0vQshkv1y3zG3tSSkWMqkWSwHmE+by06L8JtnGocjW6gcCvfwB3YtrJG6/tWivNQ==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"hamt_plus": "1.0.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.13.1"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
}
},
- "regenerator-runtime": {
+ "node_modules/regenerator-runtime": {
"version": "0.13.11",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
- "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+ "license": "MIT"
},
- "regexp.prototype.flags": {
+ "node_modules/regexp.prototype.flags": {
"version": "1.5.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz",
- "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.2.0",
"functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "resolve": {
+ "node_modules/resolve": {
"version": "2.0.0-next.4",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz",
- "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-core-module": "^2.9.0",
"path-parse": "^1.0.7",
"supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "resolve-from": {
+ "node_modules/resolve-from": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "reusify": {
+ "node_modules/reusify": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
},
- "rimraf": {
+ "node_modules/rimraf": {
"version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "rollup": {
- "version": "3.26.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.2.tgz",
- "integrity": "sha512-6umBIGVz93er97pMgQO08LuH3m6PUb3jlDUUGFsNJB6VgTCUaDFpupf5JfU30529m/UKOgmiX+uY6Sx8cOYpLA==",
+ "node_modules/rollup": {
+ "version": "3.29.4",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
"fsevents": "~2.3.2"
}
},
- "run-parallel": {
+ "node_modules/run-parallel": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
- "requires": {
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
"queue-microtask": "^1.2.2"
}
},
- "safe-regex-test": {
+ "node_modules/safe-regex-test": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.1.3",
"is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "scheduler": {
+ "node_modules/scheduler": {
"version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"loose-envify": "^1.1.0"
}
},
- "semver": {
+ "node_modules/semver": {
"version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
},
- "shebang-command": {
+ "node_modules/shebang-command": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "shebang-regex": {
+ "node_modules/shebang-regex": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "side-channel": {
+ "node_modules/side-channel": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "socket.io-client": {
+ "node_modules/socket.io-client": {
"version": "4.7.2",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz",
- "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.2",
"engine.io-client": "~6.5.2",
"socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
}
},
- "socket.io-parser": {
+ "node_modules/socket.io-parser": {
"version": "4.2.4",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
- "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"@socket.io/component-emitter": "~3.1.0",
"debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
- },
- "source-map-js": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
- "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
- "dev": true
+ "node_modules/source-map-js": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "string.prototype.matchall": {
+ "node_modules/string.prototype.matchall": {
"version": "4.0.8",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz",
- "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4",
@@ -8927,268 +5782,420 @@
"internal-slot": "^1.0.3",
"regexp.prototype.flags": "^1.4.3",
"side-channel": "^1.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "string.prototype.trim": {
+ "node_modules/string.prototype.trim": {
"version": "1.2.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz",
- "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "string.prototype.trimend": {
+ "node_modules/string.prototype.trimend": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "string.prototype.trimstart": {
+ "node_modules/string.prototype.trimstart": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.4",
"es-abstract": "^1.20.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "strip-ansi": {
+ "node_modules/strip-ansi": {
"version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "strip-json-comments": {
+ "node_modules/strip-json-comments": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "stylis": {
+ "node_modules/stylis": {
"version": "4.2.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
- "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ "license": "MIT"
},
- "supports-color": {
+ "node_modules/supports-color": {
"version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "supports-preserve-symlinks-flag": {
+ "node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "text-table": {
+ "node_modules/text-table": {
"version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
- "tiny-invariant": {
+ "node_modules/tiny-invariant": {
"version": "1.3.1",
- "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz",
- "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw=="
+ "license": "MIT"
},
- "to-fast-properties": {
+ "node_modules/to-fast-properties": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
},
- "toggle-selection": {
+ "node_modules/toggle-selection": {
"version": "1.0.6",
- "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
- "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ "license": "MIT"
},
- "tslib": {
+ "node_modules/tslib": {
"version": "2.6.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
- "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+ "license": "0BSD"
},
- "type-check": {
+ "node_modules/type-check": {
"version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "type-fest": {
+ "node_modules/type-fest": {
"version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "typed-array-byte-offset": {
+ "node_modules/typed-array-byte-offset": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"has-proto": "^1.0.1",
"is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "typed-array-length": {
+ "node_modules/typed-array-length": {
"version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "unbox-primitive": {
+ "node_modules/unbox-primitive": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"call-bind": "^1.0.2",
"has-bigints": "^1.0.2",
"has-symbols": "^1.0.3",
"which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "update-browserslist-db": {
+ "node_modules/update-browserslist-db": {
"version": "1.0.11",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
- "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
- "requires": {
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
}
},
- "uri-js": {
+ "node_modules/uri-js": {
"version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
- "requires": {
+ "license": "BSD-2-Clause",
+ "dependencies": {
"punycode": "^2.1.0"
}
},
- "use-callback-ref": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz",
- "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==",
- "requires": {
+ "node_modules/use-callback-ref": {
+ "version": "1.3.2",
+ "license": "MIT",
+ "dependencies": {
"tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "use-sidecar": {
+ "node_modules/use-sidecar": {
"version": "1.1.2",
- "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
- "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"detect-node-es": "^1.1.0",
"tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
}
},
- "vite": {
- "version": "4.4.4",
- "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz",
- "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==",
+ "node_modules/vite": {
+ "version": "4.5.3",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"esbuild": "^0.18.10",
- "fsevents": "~2.3.2",
- "postcss": "^8.4.25",
- "rollup": "^3.25.2"
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
}
},
- "which": {
+ "node_modules/which": {
"version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
- "requires": {
+ "license": "ISC",
+ "dependencies": {
"isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "which-boxed-primitive": {
+ "node_modules/which-boxed-primitive": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "which-typed-array": {
+ "node_modules/which-typed-array": {
"version": "1.1.10",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz",
- "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==",
"dev": true,
- "requires": {
+ "license": "MIT",
+ "dependencies": {
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
"has-tostringtag": "^1.0.0",
"is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "wrappy": {
+ "node_modules/wrappy": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
- "ws": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
- "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
- "requires": {}
+ "node_modules/ws": {
+ "version": "8.17.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
},
- "xmlhttprequest-ssl": {
+ "node_modules/xmlhttprequest-ssl": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz",
- "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "yallist": {
+ "node_modules/yallist": {
"version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
- "yaml": {
+ "node_modules/yaml": {
"version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+ "license": "ISC",
+ "engines": {
+ "node": ">= 6"
+ }
},
- "yocto-queue": {
+ "node_modules/yocto-queue": {
"version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/frontend/package.json b/frontend/package.json
index fabafff..68ae817 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -11,12 +11,12 @@
},
"dependencies": {
"@chakra-ui/icons": "^2.1.0",
- "@chakra-ui/react": "^2.7.1",
- "@emotion/react": "^11.11.1",
- "@emotion/styled": "^11.11.0",
+ "@chakra-ui/react": "^2.8.2",
+ "@emotion/react": "^11.13.0",
+ "@emotion/styled": "^11.13.0",
"backend": "file:..",
"date-fns": "^2.30.0",
- "framer-motion": "^10.12.21",
+ "framer-motion": "^10.18.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^4.10.1",
diff --git a/frontend/public/dark-logo.svg b/frontend/public/dark-logo.svg
index 31f0a1c..30c1d8f 100644
--- a/frontend/public/dark-logo.svg
+++ b/frontend/public/dark-logo.svg
@@ -1 +1,2 @@
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/frontend/public/light-logo.svg b/frontend/public/light-logo.svg
index ef1f465..3ef63e0 100644
--- a/frontend/public/light-logo.svg
+++ b/frontend/public/light-logo.svg
@@ -1 +1,2 @@
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/frontend/public/pear-svgrepo-com.svg b/frontend/public/pear-svgrepo-com.svg
new file mode 100644
index 0000000..f804746
--- /dev/null
+++ b/frontend/public/pear-svgrepo-com.svg
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/frontend/public/pear.png b/frontend/public/pear.png
new file mode 100644
index 0000000..eae327c
Binary files /dev/null and b/frontend/public/pear.png differ
diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index 6785836..eec75c0 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -1,4 +1,177 @@
-import { Box, Container } from "@chakra-ui/react";
+// // version 1
+// import { Box, Container } from "@chakra-ui/react";
+// import { Navigate, Route, Routes, useLocation } from "react-router-dom";
+// import UserPage from "./pages/UserPage";
+// import PostPage from "./pages/PostPage";
+// import Header from "./components/Header";
+// import HomePage from "./pages/HomePage";
+// import AuthPage from "./pages/AuthPage";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "./atoms/userAtom";
+// import UpdateProfilePage from "./pages/UpdateProfilePage";
+// import CreatePost from "./components/CreatePost";
+// import ChatPage from "./pages/ChatPage";
+// import { SettingsPage } from "./pages/SettingsPage";
+// function App() {
+// const user = useRecoilValue(userAtom);
+// const { pathname } = useLocation();
+// return (
+//
+//
+//
+//
+// : } />
+// : } />
+// : } />
+
+//
+//
+//
+// >
+// ) : (
+//
+// )
+// }
+// />
+// } />
+// : } />
+// : } />
+//
+//
+//
+// );
+// }
+
+// export default App;
+
+
+
+
+// // version 2 working
+// import { Box, Container } from "@chakra-ui/react";
+// import { Navigate, Route, Routes, useLocation } from "react-router-dom";
+// import UserPage from "./pages/UserPage";
+// import PostPage from "./pages/PostPage";
+// import Header from "./components/Header";
+// import HomePage from "./pages/HomePage";
+// import AuthPage from "./pages/AuthPage";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "./atoms/userAtom";
+// import UpdateProfilePage from "./pages/UpdateProfilePage";
+// import CreatePost from "./components/CreatePost";
+// import ChatPage from "./pages/ChatPage";
+// import { SettingsPage } from "./pages/SettingsPage";
+// import { I18nextProvider } from 'react-i18next';
+// import i18n from './i18n'; // Correct path to your i18n.js file
+
+// function App() {
+// const user = useRecoilValue(userAtom);
+// const { pathname } = useLocation();
+
+// // Retrieve language from localStorage or default to English
+// const savedLanguage = localStorage.getItem('language') || 'en';
+// i18n.changeLanguage(savedLanguage);
+
+// return (
+//
+//
+//
+//
+//
+// : } />
+// : } />
+// : } />
+//
+//
+//
+// >
+// ) : (
+//
+// )} />
+// } />
+// : } />
+// : } />
+//
+//
+//
+//
+// );
+// }
+
+// export default App;
+
+
+// this is the app.jsx trying out the ne background component
+// import { Box, Container } from "@chakra-ui/react";
+// import { Navigate, Route, Routes, useLocation } from "react-router-dom";
+// import UserPage from "./pages/UserPage";
+// import PostPage from "./pages/PostPage";
+// import Header from "./components/Header";
+// import HomePage from "./pages/HomePage";
+// import AuthPage from "./pages/AuthPage";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "./atoms/userAtom";
+// import UpdateProfilePage from "./pages/UpdateProfilePage";
+// import CreatePost from "./components/CreatePost";
+// import ChatPage from "./pages/ChatPage";
+// import { SettingsPage } from "./pages/SettingsPage";
+// import VerifyEmail from "./pages/VerifyEmail";
+// import { I18nextProvider } from 'react-i18next';
+// import i18n from './i18n';
+// import InactivityBackground from './components/InactivityBackground';
+// import ReviewModal from './components/ReviewModal';
+
+// function App() {
+// const user = useRecoilValue(userAtom);
+// const { pathname } = useLocation();
+
+// // Retrieve language from localStorage or default to English
+// const savedLanguage = localStorage.getItem('language') || 'en';
+// i18n.changeLanguage(savedLanguage);
+
+// return (
+//
+//
+//
+//
+//
+// : } />
+// : } />
+// : } />
+//
+//
+//
+// >
+// ) : (
+//
+// )}
+// />
+// } />
+// : } />
+// : } />
+// {/* New route for email verification - doesn't require auth */}
+// } />
+//
+//
+// {/* Add ReviewModal outside the Container to ensure it can appear over any content */}
+// {user && user.role === "admin" && }
+//
+//
+// );
+// }
+
+// export default App;
+
+// post review
+import { Box } from "@chakra-ui/react";
import { Navigate, Route, Routes, useLocation } from "react-router-dom";
import UserPage from "./pages/UserPage";
import PostPage from "./pages/PostPage";
@@ -11,38 +184,42 @@ import UpdateProfilePage from "./pages/UpdateProfilePage";
import CreatePost from "./components/CreatePost";
import ChatPage from "./pages/ChatPage";
import { SettingsPage } from "./pages/SettingsPage";
+import VerifyEmail from "./pages/VerifyEmail";
+import TVPage from "./pages/TVPage";
+import { I18nextProvider } from 'react-i18next';
+import i18n from './i18n';
+import ReviewModal from './components/ReviewModal';
+
function App() {
- const user = useRecoilValue(userAtom);
- const { pathname } = useLocation();
- return (
-
-
-
-
- : } />
- : } />
- : } />
-
-
-
-
- >
- ) : (
-
- )
- }
- />
- } />
- : } />
- : } />
-
-
-
- );
+ const user = useRecoilValue(userAtom);
+ const { pathname } = useLocation();
+ const savedLanguage = localStorage.getItem('language') || 'en';
+ i18n.changeLanguage(savedLanguage);
+
+ const isPotentialReviewer = user && (user.role === "admin" || user.role === "teacher" || user.role === "student");
+ const isTVPage = pathname === '/tv';
+
+ return (
+
+
+ {!isTVPage && }
+
+
+ : } />
+ : } />
+ : } />
+ } />
+ } />
+ : } />
+ : } />
+ } />
+ } />
+
+
+ {!isTVPage && isPotentialReviewer && }
+
+
+ );
}
-export default App;
+export default App;
\ No newline at end of file
diff --git a/frontend/src/components/Actions.jsx b/frontend/src/components/Actions.jsx
index afcf240..a6f3a4e 100644
--- a/frontend/src/components/Actions.jsx
+++ b/frontend/src/components/Actions.jsx
@@ -1,241 +1,223 @@
+
+// this is the version with transaltions (working)
import {
- Box,
- Button,
- Flex,
- FormControl,
- Input,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Text,
- useDisclosure,
+ Box,
+ Button,
+ Flex,
+ FormControl,
+ Input,
+ Modal,
+ ModalBody,
+ ModalCloseButton,
+ ModalContent,
+ ModalFooter,
+ ModalHeader,
+ ModalOverlay,
+ Text,
+ useDisclosure,
} from "@chakra-ui/react";
-import { useState } from "react";
+import { useState, useCallback, useEffect } from "react";
import { useRecoilState, useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
import useShowToast from "../hooks/useShowToast";
import postsAtom from "../atoms/postsAtom";
+import { debounce } from "lodash";
+import { useTranslation } from 'react-i18next'; // Import useTranslation
const Actions = ({ post }) => {
- const user = useRecoilValue(userAtom);
- const [liked, setLiked] = useState(post.likes.includes(user?._id));
- const [posts, setPosts] = useRecoilState(postsAtom);
- const [isLiking, setIsLiking] = useState(false);
- const [isReplying, setIsReplying] = useState(false);
- const [reply, setReply] = useState("");
-
- const showToast = useShowToast();
- const { isOpen, onOpen, onClose } = useDisclosure();
-
- const handleLikeAndUnlike = async () => {
- if (!user) return showToast("Error", "You must be logged in to like a post", "error");
- if (isLiking) return;
- setIsLiking(true);
- try {
- const res = await fetch("/api/posts/like/" + post._id, {
- method: "PUT",
- headers: {
- "Content-Type": "application/json",
- },
- });
- const data = await res.json();
- if (data.error) return showToast("Error", data.error, "error");
-
- if (!liked) {
- // add the id of the current user to post.likes array
- const updatedPosts = posts.map((p) => {
- if (p._id === post._id) {
- return { ...p, likes: [...p.likes, user._id] };
- }
- return p;
- });
- setPosts(updatedPosts);
- } else {
- // remove the id of the current user from post.likes array
- const updatedPosts = posts.map((p) => {
- if (p._id === post._id) {
- return { ...p, likes: p.likes.filter((id) => id !== user._id) };
- }
- return p;
- });
- setPosts(updatedPosts);
- }
-
- setLiked(!liked);
- } catch (error) {
- showToast("Error", error.message, "error");
- } finally {
- setIsLiking(false);
- }
- };
-
- const handleReply = async () => {
- if (!user) return showToast("Error", "You must be logged in to reply to a post", "error");
- if (isReplying) return;
- setIsReplying(true);
- try {
- const res = await fetch("/api/posts/reply/" + post._id, {
- method: "PUT",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({ text: reply }),
- });
- const data = await res.json();
- if (data.error) return showToast("Error", data.error, "error");
-
- const updatedPosts = posts.map((p) => {
- if (p._id === post._id) {
- return { ...p, replies: [...p.replies, data] };
- }
- return p;
- });
- setPosts(updatedPosts);
- showToast("Success", "Reply posted successfully", "success");
- onClose();
- setReply("");
- } catch (error) {
- showToast("Error", error.message, "error");
- } finally {
- setIsReplying(false);
- }
- };
-
- return (
-
- e.preventDefault()}>
-
-
-
-
-
-
-
-
-
-
- {post.replies.length} replies
-
-
-
- {post.likes.length} likes
-
-
-
-
-
-
-
-
-
-
- setReply(e.target.value)}
- />
-
-
-
-
-
-
-
-
-
- );
+ const user = useRecoilValue(userAtom);
+ const [liked, setLiked] = useState(post.likes.includes(user?._id));
+ const [posts, setPosts] = useRecoilState(postsAtom);
+ const [isLiking, setIsLiking] = useState(false);
+ const [isReplying, setIsReplying] = useState(false);
+ const [reply, setReply] = useState("");
+ const showToast = useShowToast();
+ const { isOpen, onOpen, onClose } = useDisclosure();
+
+ const { t, i18n } = useTranslation(); // Initialize the translation hook
+ const [language, setLanguage] = useState(i18n.language); // Add a state for language
+
+ useEffect(() => {
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on('languageChanged', handleLanguageChange); // Listen for language change
+
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange); // Cleanup on component unmount
+ };
+ }, [i18n]);
+
+ const handleLikeAndUnlike = useCallback(
+ debounce(async () => {
+ if (!user) return showToast(t("Error"), t("You must be logged in to like a post"), "error");
+ if (isLiking) return;
+
+ const originalLiked = liked;
+ const originalPosts = [...posts];
+
+ // Optimistically update the UI
+ setLiked(!liked);
+ setPosts(posts.map(p => p._id === post._id ? {
+ ...p,
+ likes: !liked ? [...p.likes, user._id] : p.likes.filter(id => id !== user._id),
+ } : p));
+
+ setIsLiking(true);
+ try {
+ const res = await fetch(`/api/posts/like/${post._id}`, {
+ method: "PUT",
+ headers: { "Content-Type": "application/json" },
+ });
+ const data = await res.json();
+
+ if (data.error) {
+ throw new Error(data.error);
+ }
+ } catch (error) {
+ // Revert the state if API call fails
+ setLiked(originalLiked);
+ setPosts(originalPosts);
+ showToast(t("Error"), error.message, "error");
+ } finally {
+ setIsLiking(false);
+ }
+ }, 300),
+ [liked, isLiking, post._id, posts, setPosts, showToast, user?._id, t]
+ );
+
+ const handleReply = async () => {
+ if (!user) return showToast(t("Error"), t("You must be logged in to reply to a post"), "error");
+ if (isReplying) return;
+
+ setIsReplying(true);
+ try {
+ const res = await fetch(`/api/posts/reply/${post._id}`, {
+ method: "PUT",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ text: reply }),
+ });
+ const data = await res.json();
+
+ if (data.error) {
+ showToast(t("Error"), data.error, "error");
+ return;
+ }
+
+ setPosts(posts.map(p => p._id === post._id ? { ...p, replies: [...p.replies, data] } : p));
+ showToast(t("Success"), t("Reply posted successfully"), "success");
+ onClose();
+ setReply("");
+ } catch (error) {
+ showToast(t("Error"), error.message, "error");
+ } finally {
+ setIsReplying(false);
+ }
+ };
+
+ return (
+
+ e.preventDefault()}>
+
+
+
+
+
+ {/* Removed ShareSVG */}
+
+
+
+
+ {post.replies.length} {t("replies")}
+
+
+
+ {post.likes.length} {t("likes")}
+
+
+
+
+
+
+ {t("Add Reply")}
+
+
+
+ setReply(e.target.value)}
+ />
+
+
+
+
+
+
+
+
+
+ );
};
export default Actions;
const RepostSVG = () => {
- return (
-
- );
+ const { t } = useTranslation(); // Initialize the translation hook
+
+ return (
+
+ );
};
-const ShareSVG = () => {
- return (
-
- );
-};
+
+// this is repost function
diff --git a/frontend/src/components/AdminDropdownModal.jsx b/frontend/src/components/AdminDropdownModal.jsx
new file mode 100644
index 0000000..e69de29
diff --git a/frontend/src/components/Comment.jsx b/frontend/src/components/Comment.jsx
index 3673d57..bc4bfec 100644
--- a/frontend/src/components/Comment.jsx
+++ b/frontend/src/components/Comment.jsx
@@ -1,22 +1,91 @@
-import { Avatar, Divider, Flex, Text } from "@chakra-ui/react";
-
-const Comment = ({ reply, lastReply }) => {
- return (
- <>
-
-
-
-
-
- {reply.username}
-
-
- {reply.text}
-
-
- {!lastReply ? : null}
- >
- );
+// import { Avatar, Divider, Flex, Text } from "@chakra-ui/react";
+
+// const Comment = ({ reply, lastReply }) => {
+// return (
+// <>
+//
+//
+//
+//
+//
+// {reply.username}
+//
+//
+// {reply.text}
+//
+//
+// {!lastReply ? : null}
+// >
+// );
+// };
+
+// export default Comment;
+import { Avatar, Divider, Flex, Text, IconButton, Tooltip } from "@chakra-ui/react";
+import { DeleteIcon } from "@chakra-ui/icons";
+import { useRecoilValue } from "recoil";
+import userAtom from "../atoms/userAtom";
+import useShowToast from "../hooks/useShowToast";
+
+const Comment = ({ reply, lastReply, onDelete }) => {
+ const currentUser = useRecoilValue(userAtom);
+ const showToast = useShowToast();
+
+ // If the current user is frozen, do not display the comment
+ if (currentUser?.isFrozen) return null;
+
+ const handleDelete = async () => {
+ try {
+ const res = await fetch(`/api/posts/comment/${reply._id}`, {
+ method: "DELETE",
+ headers: {
+ Authorization: `Bearer ${currentUser.token}`,
+ },
+ });
+
+ const data = await res.json();
+
+ if (data.error) {
+ showToast("Error", data.error, "error");
+ return;
+ }
+
+ onDelete(reply._id);
+ showToast("Success", "Comment deleted successfully", "success");
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ }
+ };
+
+ const showDeleteButton = currentUser?.role === "admin" || currentUser?._id === reply.userId;
+
+ return (
+ <>
+
+
+
+
+
+ {reply.username}
+
+ {showDeleteButton && (
+
+ }
+ size="xs"
+ colorScheme="red"
+ variant="ghost"
+ onClick={handleDelete}
+ />
+
+ )}
+
+ {reply.text}
+
+
+ {!lastReply && }
+ >
+ );
};
export default Comment;
diff --git a/frontend/src/components/CreatePost.jsx b/frontend/src/components/CreatePost.jsx
index b0a62f3..bae41c6 100644
--- a/frontend/src/components/CreatePost.jsx
+++ b/frontend/src/components/CreatePost.jsx
@@ -1,153 +1,884 @@
-import { AddIcon } from "@chakra-ui/icons";
+// // original
+// import { AddIcon } from "@chakra-ui/icons";
+// import {
+// Button,
+// CloseButton,
+// Flex,
+// FormControl,
+// Image,
+// Input,
+// Modal,
+// ModalBody,
+// ModalCloseButton,
+// ModalContent,
+// ModalFooter,
+// ModalHeader,
+// ModalOverlay,
+// Text,
+// Textarea,
+// Select,
+// useColorModeValue,
+// useDisclosure,
+// } from "@chakra-ui/react";
+// import { useRef, useState } from "react";
+// import usePreviewImg from "../hooks/usePreviewImg";
+// import { BsFillImageFill } from "react-icons/bs";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import useShowToast from "../hooks/useShowToast";
+// import postsAtom from "../atoms/postsAtom";
+// import { useParams } from "react-router-dom";
+// import { useTranslation } from 'react-i18next';
+
+// const MAX_CHAR = 500;
+
+// const CreatePost = () => {
+// const { isOpen, onOpen, onClose } = useDisclosure();
+// const [postText, setPostText] = useState("");
+// const [targetAudience, setTargetAudience] = useState("all"); // Default to 'all'
+// const { handleImageChange, imgUrl, setImgUrl } = usePreviewImg();
+// const imageRef = useRef(null);
+// const [remainingChar, setRemainingChar] = useState(MAX_CHAR);
+// const user = useRecoilValue(userAtom);
+// const showToast = useShowToast();
+// const [loading, setLoading] = useState(false);
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const { username } = useParams();
+// const { t } = useTranslation();
+
+// const handleTextChange = (e) => {
+// const inputText = e.target.value;
+// if (inputText.length > MAX_CHAR) {
+// const truncatedText = inputText.slice(0, MAX_CHAR);
+// setPostText(truncatedText);
+// setRemainingChar(0);
+// } else {
+// setPostText(inputText);
+// setRemainingChar(MAX_CHAR - inputText.length);
+// }
+// };
+
+// const handleCreatePost = async () => {
+// setLoading(true);
+// try {
+// // Create the payload for the post
+// const payload = {
+// postedBy: user._id,
+// text: postText,
+// img: imgUrl,
+// };
+
+// // Only include targetAudience for teachers, set it to null for students
+// if (user.role === "teacher") {
+// payload.targetAudience = targetAudience;
+// } else {
+// payload.targetAudience = null; // Set to null for students
+// }
+
+// // Send the post request to the server
+// const res = await fetch("/api/posts/create", {
+// method: "POST",
+// headers: {
+// "Content-Type": "application/json",
+// },
+// body: JSON.stringify(payload),
+// });
+
+// const data = await res.json();
+// if (data.error) {
+// showToast(t("Error"), data.error, "error");
+// return;
+// }
+// showToast(t("Success"), t("Post created successfully"), "success");
+
+// // Add the new post to the state if it should be visible to the user
+// if (
+// data.targetAudience === "all" ||
+// data.targetAudience === user.yearGroup ||
+// user.role === "student"
+// ) {
+// if (username === user.username) {
+// setPosts([data, ...posts]);
+// }
+// }
+
+// // Reset form states after posting
+// onClose();
+// setPostText("");
+// setImgUrl("");
+// setTargetAudience(user.role === "teacher" ? "all" : ""); // Reset based on role
+
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setLoading(false);
+// }
+// };
+
+// return (
+// <>
+//
+
+//
+//
+//
+// {t("Create Post")}
+//
+//
+//
+//
+//
+// {remainingChar}/{MAX_CHAR}
+//
+
+//
+// imageRef.current.click()}
+// aria-label={t("Add Image")}
+// />
+
+// {/* Dropdown for Target Audience */}
+// {user.role === "teacher" && (
+//
+// )}
+//
+
+// {imgUrl && (
+//
+//
+// setImgUrl("")}
+// bg={"gray.800"}
+// position={"absolute"}
+// top={2}
+// right={2}
+// />
+//
+// )}
+//
+
+//
+//
+//
+//
+//
+// >
+// );
+// };
+
+// export default CreatePost;
+
+// oldhand create post function not working i think
+// const handleCreatePost = async () => {
+// try {
+// const payload = {
+// postedBy: user._id,
+// text: postText,
+// img: imgUrl,
+// targetYearGroups: targetYearGroups.length ? targetYearGroups : ["all"],
+// targetDepartments: targetDepartments.length ? targetDepartments : [],
+// };
+
+// console.log("Posting payload:", payload); // Add this line to log the payload
+
+// const res = await fetch("/api/posts/create", {
+// method: "POST",
+// headers: { "Content-Type": "application/json" },
+// body: JSON.stringify(payload),
+// });
+
+// const data = await res.json();
+// if (data.error) throw new Error(data.error);
+
+// showToast(t("Success"), t("Post created successfully"), "success");
+// onClose();
+// setPostText("");
+// setImgUrl("");
+// setTargetYearGroups([]);
+// setTargetDepartments([]);
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// }
+// };
+
+// admin role update(working)
+// import { AddIcon } from "@chakra-ui/icons";
+// import {
+// Button,
+// CloseButton,
+// Flex,
+// FormControl,
+// Image,
+// Input,
+// Modal,
+// ModalBody,
+// ModalCloseButton,
+// ModalContent,
+// ModalFooter,
+// ModalHeader,
+// ModalOverlay,
+// Text,
+// Textarea,
+// useColorModeValue,
+// useDisclosure,
+// Select,
+// } from "@chakra-ui/react";
+// import { useRef, useState } from "react";
+// import usePreviewImg from "../hooks/usePreviewImg";
+// import { BsFillImageFill } from "react-icons/bs";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import useShowToast from "../hooks/useShowToast";
+// import { useTranslation } from "react-i18next";
+
+// const MAX_CHAR = 500;
+
+// const CreatePost = () => {
+// const { isOpen, onOpen, onClose } = useDisclosure();
+// const [postText, setPostText] = useState("");
+// const [targetYearGroups, setTargetYearGroups] = useState([]);
+// const [targetDepartments, setTargetDepartments] = useState([]);
+// const { handleImageChange, imgUrl, setImgUrl } = usePreviewImg();
+// const imageRef = useRef(null);
+// const [remainingChar, setRemainingChar] = useState(MAX_CHAR);
+// const user = useRecoilValue(userAtom);
+// const showToast = useShowToast();
+// const { t } = useTranslation();
+// const [isLoading, setIsLoading] = useState(false);
+
+// const handleTextChange = (e) => {
+// const inputText = e.target.value;
+// setPostText(inputText.slice(0, MAX_CHAR));
+// setRemainingChar(MAX_CHAR - inputText.length);
+// };
+
+// const handleCreatePost = async () => {
+// setIsLoading(true);
+// try {
+// // Default payload for all users, with special handling for different roles
+// const payload = {
+// postedBy: user._id,
+// text: postText,
+// targetAudience: "all",
+// targetYearGroups: [],
+// targetDepartments: [],
+// };
+
+// // Role-specific modifications
+// if (user.role === "teacher") {
+// if (targetYearGroups.length === 0) {
+// showToast(t("Error"), t("Teachers must specify year groups"), "error");
+// setIsLoading(false);
+// return;
+// }
+// payload.targetYearGroups = targetYearGroups;
+// }
+
+// if (user.role === "admin") {
+// if (!targetYearGroups.length && !targetDepartments.length) {
+// showToast(
+// t("Error"),
+// t("Admins must specify target year groups or departments"),
+// "error"
+// );
+// setIsLoading(false);
+// return;
+// }
+// payload.targetYearGroups = targetYearGroups;
+// payload.targetDepartments = targetDepartments;
+// }
+
+// if (imgUrl) payload.img = imgUrl;
+
+// const res = await fetch("/api/posts/create", {
+// method: "POST",
+// headers: { "Content-Type": "application/json" },
+// body: JSON.stringify(payload),
+// });
+
+// const data = await res.json();
+
+// if (data.error) {
+// showToast(t("Error"), data.error, "error");
+// return;
+// }
+
+// showToast(t("Success"), t("Post created successfully"), "success");
+
+// // Reset form
+// setPostText("");
+// setImgUrl("");
+// setTargetYearGroups([]);
+// setTargetDepartments([]);
+// onClose();
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setIsLoading(false);
+// }
+// };
+
+// return (
+// <>
+//
+
+//
+//
+//
+// {t("Create Post")}
+//
+//
+//
+//
+//
+// {remainingChar}/{MAX_CHAR}
+//
+//
+// imageRef.current.click()}
+// aria-label={t("Add Image")}
+// />
+
+// {/* Role-specific Target Options */}
+// {user.role === "teacher" && (
+//
+// )}
+
+// {user.role === "admin" && (
+// <>
+//
+
+//
+// >
+// )}
+//
+
+// {imgUrl && (
+//
+//
+// setImgUrl("")}
+// />
+//
+// )}
+//
+
+//
+//
+//
+//
+//
+// >
+// );
+// };
+
+// export default CreatePost;
+
+// post review system
+import { useState, useRef } from 'react';
import {
- Button,
- CloseButton,
- Flex,
- FormControl,
- Image,
- Input,
- Modal,
- ModalBody,
- ModalCloseButton,
- ModalContent,
- ModalFooter,
- ModalHeader,
- ModalOverlay,
- Text,
- Textarea,
- useColorModeValue,
- useDisclosure,
+ Button,
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+ ModalCloseButton,
+ FormControl,
+ Textarea,
+ Input,
+ useDisclosure,
+ Progress,
+ Box,
+ Text,
+ useColorModeValue,
+ Alert,
+ AlertIcon,
+ Select,
+ Flex,
+ Image,
+ CloseButton
} from "@chakra-ui/react";
-import { useRef, useState } from "react";
-import usePreviewImg from "../hooks/usePreviewImg";
+import { AddIcon } from "@chakra-ui/icons";
import { BsFillImageFill } from "react-icons/bs";
-import { useRecoilState, useRecoilValue } from "recoil";
+import { FaLock } from "react-icons/fa";
+import usePreviewImg from "../hooks/usePreviewImg";
+import { useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
import useShowToast from "../hooks/useShowToast";
-import postsAtom from "../atoms/postsAtom";
-import { useParams } from "react-router-dom";
+import { useTranslation } from "react-i18next";
const MAX_CHAR = 500;
const CreatePost = () => {
- const { isOpen, onOpen, onClose } = useDisclosure();
- const [postText, setPostText] = useState("");
- const { handleImageChange, imgUrl, setImgUrl } = usePreviewImg();
- const imageRef = useRef(null);
- const [remainingChar, setRemainingChar] = useState(MAX_CHAR);
- const user = useRecoilValue(userAtom);
- const showToast = useShowToast();
- const [loading, setLoading] = useState(false);
- const [posts, setPosts] = useRecoilState(postsAtom);
- const { username } = useParams();
-
- const handleTextChange = (e) => {
- const inputText = e.target.value;
-
- if (inputText.length > MAX_CHAR) {
- const truncatedText = inputText.slice(0, MAX_CHAR);
- setPostText(truncatedText);
- setRemainingChar(0);
- } else {
- setPostText(inputText);
- setRemainingChar(MAX_CHAR - inputText.length);
- }
- };
-
- const handleCreatePost = async () => {
- setLoading(true);
- try {
- const res = await fetch("/api/posts/create", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify({ postedBy: user._id, text: postText, img: imgUrl }),
- });
-
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- showToast("Success", "Post created successfully", "success");
- if (username === user.username) {
- setPosts([data, ...posts]);
- }
- onClose();
- setPostText("");
- setImgUrl("");
- } catch (error) {
- showToast("Error", error, "error");
- } finally {
- setLoading(false);
- }
- };
-
- return (
- <>
-
-
-
-
-
-
- Create Post
-
-
-
-
-
- {remainingChar}/{MAX_CHAR}
-
-
-
-
- imageRef.current.click()}
- />
-
-
- {imgUrl && (
-
-
- {
- setImgUrl("");
- }}
- bg={"gray.800"}
- position={"absolute"}
- top={2}
- right={2}
- />
-
- )}
-
-
-
-
-
-
-
- >
- );
+ const { isOpen, onOpen, onClose } = useDisclosure();
+ const [postText, setPostText] = useState("");
+ const [targetYearGroups, setTargetYearGroups] = useState([]);
+ const [targetDepartments, setTargetDepartments] = useState([]);
+ const { handleImageChange, imgUrl, setImgUrl } = usePreviewImg();
+ const imageRef = useRef(null);
+ const [remainingChar, setRemainingChar] = useState(MAX_CHAR);
+ const user = useRecoilValue(userAtom);
+ const showToast = useShowToast();
+ const [isLoading, setIsLoading] = useState(false);
+ const [postStatus, setPostStatus] = useState(null);
+ const progressColor = useColorModeValue("gray.200", "gray.600");
+ const progressFilledColor = useColorModeValue("gray.500", "gray.300");
+ const { t } = useTranslation();
+ const [isHovered, setIsHovered] = useState(false);
+
+ const handleTextChange = (e) => {
+ const inputText = e.target.value;
+ setPostText(inputText.slice(0, MAX_CHAR));
+ setRemainingChar(MAX_CHAR - inputText.length);
+ };
+
+ const handleCreatePost = async () => {
+ setIsLoading(true);
+ try {
+ if (!postText.trim()) {
+ showToast("Error", "Post text cannot be empty", "error");
+ setIsLoading(false);
+ return;
+ }
+
+ // Base payload structure
+ const payload = {
+ postedBy: user._id,
+ text: postText,
+ img: imgUrl || undefined
+ };
+
+ // Role-specific payload modifications
+ switch (user.role) {
+ case "student":
+ // Students can only post to everyone
+ payload.targetAudience = "all";
+ payload.targetYearGroups = [];
+ payload.targetDepartments = [];
+ break;
+
+ case "teacher":
+ // Teachers must specify year groups
+ if (!targetYearGroups.length) {
+ showToast("Error", "Please select at least one year group", "error");
+ setIsLoading(false);
+ return;
+ }
+
+ // If "all" is selected, that's the only target
+ if (targetYearGroups.includes("all")) {
+ payload.targetAudience = "all";
+ payload.targetYearGroups = [];
+ } else {
+ // Otherwise use specific year groups
+ payload.targetAudience = targetYearGroups[0]; // Primary target
+ payload.targetYearGroups = targetYearGroups; // All selected groups
+ }
+ payload.targetDepartments = []; // Teachers can't target departments
+ break;
+
+ case "admin":
+ // Admins must specify either year groups or departments
+ if (!targetYearGroups.length && !targetDepartments.length) {
+ showToast(
+ "Error",
+ "Please select either year groups or departments to target",
+ "error"
+ );
+ setIsLoading(false);
+ return;
+ }
+
+ // Handle year group targeting
+ if (targetYearGroups.includes("all")) {
+ payload.targetAudience = "all";
+ payload.targetYearGroups = [];
+ } else if (targetYearGroups.length) {
+ payload.targetYearGroups = targetYearGroups;
+ payload.targetAudience = targetYearGroups[0];
+ }
+
+ // Handle department targeting
+ if (targetDepartments.length) {
+ // If both year groups and departments are selected,
+ // departments take precedence
+ payload.targetDepartments = targetDepartments;
+ payload.targetAudience = targetDepartments[0];
+ }
+
+ // Handle TV targeting
+ if (targetDepartments.includes("tv")) {
+ payload.targetAudience = "tv";
+ payload.targetDepartments = ["tv"];
+ payload.targetYearGroups = [];
+ }
+ break;
+
+ default:
+ showToast("Error", "Invalid user role", "error");
+ setIsLoading(false);
+ return;
+ }
+
+ const res = await fetch("/api/posts/create", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json"
+ },
+ body: JSON.stringify(payload)
+ });
+
+ const data = await res.json();
+
+ if (data.error) {
+ showToast("Error", data.error, "error");
+ return;
+ }
+
+ // Success handling
+ showToast("Success", "Post created successfully", "success");
+
+ // Reset form
+ setPostText("");
+ setImgUrl("");
+ setTargetYearGroups([]);
+ setTargetDepartments([]);
+ onClose();
+
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ const resetForm = () => {
+ setPostText("");
+ setImgUrl("");
+ setTargetYearGroups([]);
+ setTargetDepartments([]);
+ onClose();
+ };
+
+ // Return frozen account button if account is frozen
+ if (user?.isFrozen) {
+ return (
+
+ );
+ }
+
+
+ return (
+ <>
+
+
+
+
+
+ {t("Create Post")}
+
+
+
+
+
+ {remainingChar}/{MAX_CHAR}
+
+
+
+ imageRef.current.click()}
+ aria-label={t("Add Image")}
+ />
+
+ {user.role === "teacher" && (
+
+ )}
+
+ {user.role === "admin" && (
+ <>
+
+
+
+ >
+ )}
+
+ {imgUrl && (
+
+
+ setImgUrl("")}
+ />
+
+ )}
+
+ {postStatus === 'pending' && (
+
+
+
+ {t("Your post is being reviewed")}
+
+
+
+ )}
+
+
+
+
+
+
+
+
+ >
+ );
};
-export default CreatePost;
+export default CreatePost;
\ No newline at end of file
diff --git a/frontend/src/components/Header.jsx b/frontend/src/components/Header.jsx
index 6d9c272..d27be88 100644
--- a/frontend/src/components/Header.jsx
+++ b/frontend/src/components/Header.jsx
@@ -1,66 +1,1132 @@
+// // version 1 this is the orignal no hover no animations just a basic icon navbar
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}>
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}>
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+// version 2 this is the second version with basic additions lik hover color change
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{ color: "teal.500", transform: "scale(1.1)" }}
+// transition="all 0.2s ease-in-out"
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{ color: "teal.500", transform: "scale(1.1)" }}
+// transition="all 0.2s ease-in-out"
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+
+// version 2
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)", // Increased scale for exaggerated effect
+// }}
+// transition="all 0.3s ease-in-out" // Smooth transition
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)", // Increased scale for exaggerated effect
+// }}
+// transition="all 0.3s ease-in-out" // Smooth transition
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+// version 2 with added update to roles
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)", // Increased scale for exaggerated effect
+// }}
+// transition="all 0.3s ease-in-out" // Smooth transition
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)", // Increased scale for exaggerated effect
+// }}
+// transition="all 0.3s ease-in-out" // Smooth transition
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+// version three with restricitons and lock animations
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink, useNavigate } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+// import { useState } from "react";
+// import { FaLock } from "react-icons/fa";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const navigate = useNavigate();
+// const [hoveringLock, setHoveringLock] = useState(false);
+
+// // Check if the user has access to the chat page based on their email
+// const hasChatAccess = user?.email?.includes("students");
+
+// const handleChatClick = (e) => {
+// if (!hasChatAccess) {
+// e.preventDefault(); // Prevent navigation if the user doesn't have access
+// setHoveringLock(true); // Show red lock when hovering
+// } else {
+// setHoveringLock(false);
+// navigate("/chat");
+// }
+// };
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+
+// !hasChatAccess && setHoveringLock(true)}
+// onMouseLeave={() => setHoveringLock(false)}
+// >
+// {hoveringLock ? : }
+//
+
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+// this is version 4 with the new check chat access integrated working
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink, useNavigate } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+// import { useState } from "react";
+// import { FaLock } from "react-icons/fa";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const navigate = useNavigate();
+// const [hoveringLock, setHoveringLock] = useState(false);
+
+// // Check if the user has access to the chat page based on their email
+// const hasChatAccess = user?.email?.includes("students");
+
+// const handleChatClick = (e) => {
+// if (!hasChatAccess) {
+// e.preventDefault(); // Prevent navigation if the user doesn't have access
+// setHoveringLock(true); // Show red lock when hovering
+// } else {
+// setHoveringLock(false);
+// navigate("/chat"); // Navigate to chat page if access is allowed
+// }
+// };
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+
+// !hasChatAccess && setHoveringLock(true)}
+// onMouseLeave={() => setHoveringLock(false)}
+// >
+// {hoveringLock ? : }
+//
+
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+// this is version five with the new time restrictions to the check chat access(this is wokring version)
+// import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
+// import { useRecoilValue, useSetRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { AiFillHome } from "react-icons/ai";
+// import { RxAvatar } from "react-icons/rx";
+// import { Link as RouterLink, useNavigate } from "react-router-dom";
+// import { FiLogOut } from "react-icons/fi";
+// import useLogout from "../hooks/useLogout";
+// import authScreenAtom from "../atoms/authAtom";
+// import { BsFillChatQuoteFill } from "react-icons/bs";
+// import { MdOutlineSettings } from "react-icons/md";
+// import { useState } from "react";
+// import { FaLock } from "react-icons/fa";
+
+// const Header = () => {
+// const { colorMode, toggleColorMode } = useColorMode();
+// const user = useRecoilValue(userAtom);
+// const logout = useLogout();
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const navigate = useNavigate();
+// const [hoveringLock, setHoveringLock] = useState(false);
+
+// // Check if the user has access to the chat page based on their email and time restrictions
+// const isStudent = user?.email?.includes("students");
+// const currentDate = new Date();
+// const dayOfWeek = currentDate.getDay(); // Sunday - 0, Monday - 1, ..., Saturday - 6
+// const currentTime = currentDate.getHours() * 100 + currentDate.getMinutes(); // Convert to HHMM format
+
+// // School hours in HHMM format
+// const schoolStart = 810;
+// const lunchStart = 1250;
+// const lunchEnd = 1340;
+// const schoolEnd = 1535;
+
+// // Determine if the student has chat access based on the day and time
+// const hasChatAccess =
+// isStudent &&
+// ((dayOfWeek >= 1 && dayOfWeek <= 5 &&
+// (currentTime < schoolStart ||
+// (currentTime >= lunchStart && currentTime <= lunchEnd) ||
+// currentTime > schoolEnd)) ||
+// dayOfWeek === 0 || dayOfWeek === 6); // Allow access on weekends
+
+// const handleChatClick = (e) => {
+// if (!hasChatAccess) {
+// e.preventDefault(); // Prevent navigation if the user doesn't have access
+// setHoveringLock(true); // Show red lock when hovering
+// } else {
+// setHoveringLock(false);
+// navigate("/chat"); // Navigate to chat page if access is allowed
+// }
+// };
+
+// return (
+//
+// {user && (
+//
+//
+//
+// )}
+// {!user && (
+// setAuthScreen("login")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Login
+//
+// )}
+
+//
+
+// {user && (
+//
+//
+//
+//
+
+// !hasChatAccess && setHoveringLock(true)}
+// onMouseLeave={() => setHoveringLock(false)}
+// >
+// {hoveringLock ? : }
+//
+
+//
+//
+//
+//
+//
+// )}
+
+// {!user && (
+// setAuthScreen("signup")}
+// _hover={{
+// color: "teal.500",
+// transform: "scale(1.2)",
+// }}
+// transition="all 0.3s ease-in-out"
+// >
+// Sign up
+//
+// )}
+//
+// );
+// };
+
+// export default Header;
+
+
+// admin role update
import { Button, Flex, Image, Link, useColorMode } from "@chakra-ui/react";
import { useRecoilValue, useSetRecoilState } from "recoil";
import userAtom from "../atoms/userAtom";
import { AiFillHome } from "react-icons/ai";
import { RxAvatar } from "react-icons/rx";
-import { Link as RouterLink } from "react-router-dom";
+import { Link as RouterLink, useNavigate } from "react-router-dom";
import { FiLogOut } from "react-icons/fi";
import useLogout from "../hooks/useLogout";
import authScreenAtom from "../atoms/authAtom";
import { BsFillChatQuoteFill } from "react-icons/bs";
import { MdOutlineSettings } from "react-icons/md";
+import { useState } from "react";
+import { FaLock } from "react-icons/fa";
+import { PiTelevisionSimpleBold } from "react-icons/pi";
const Header = () => {
- const { colorMode, toggleColorMode } = useColorMode();
- const user = useRecoilValue(userAtom);
- const logout = useLogout();
- const setAuthScreen = useSetRecoilState(authScreenAtom);
-
- return (
-
- {user && (
-
-
-
- )}
- {!user && (
- setAuthScreen("login")}>
- Login
-
- )}
-
-
-
- {user && (
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
- {!user && (
- setAuthScreen("signup")}>
- Sign up
-
- )}
-
- );
+ const { colorMode, toggleColorMode } = useColorMode();
+ const user = useRecoilValue(userAtom);
+ const logout = useLogout();
+ const setAuthScreen = useSetRecoilState(authScreenAtom);
+ const navigate = useNavigate();
+ const [hoverState, setHoverState] = useState({
+ chat: false,
+ lock: false,
+ tv: false
+ });
+
+ // Determine user roles based on `user.role`
+ const isStudent = user?.role === "student";
+ const isTeacher = user?.role === "teacher";
+ const isAdmin = user?.role === "admin";
+
+ const currentDate = new Date();
+ const dayOfWeek = currentDate.getDay(); // Sunday - 0, Monday - 1, ..., Saturday - 6
+ const currentTime = currentDate.getHours() * 100 + currentDate.getMinutes(); // Convert to HHMM format
+
+ // School hours in HHMM format
+ const schoolStart = 810;
+ const lunchStart = 1250;
+ const lunchEnd = 1340;
+ const schoolEnd = 1535;
+
+ // Determine if the student has chat access based on the day and time
+ const hasChatAccess =
+ isStudent &&
+ ((dayOfWeek >= 1 && dayOfWeek <= 5 &&
+ (currentTime < schoolStart ||
+ (currentTime >= lunchStart && currentTime <= lunchEnd) ||
+ currentTime > schoolEnd)) ||
+ dayOfWeek === 0 || dayOfWeek === 6); // Allow access on weekends
+
+ const handleChatClick = (e) => {
+ if (user?.isFrozen || !hasChatAccess) {
+ e.preventDefault(); // Prevent navigation if the user doesn't have access
+ setHoverState({ ...hoverState, lock: true }); // Show lock when hovering
+ } else {
+ setHoverState({ ...hoverState, chat: false, lock: false });
+ navigate("/chat"); // Navigate to chat page if access is allowed
+ }
+ };
+
+ const handleTVClick = (e) => {
+ if (!isAdmin) {
+ e.preventDefault();
+ setHoverState({ ...hoverState, tv: true });
+ } else {
+ setHoverState({ ...hoverState, tv: false });
+ navigate("/tv");
+ }
+ };
+
+ return (
+
+ {user && (
+
+
+
+ )}
+
+ {!user && (
+ setAuthScreen("login")}
+ _hover={{
+ color: "teal.500",
+ transform: "scale(1.2)",
+ }}
+ transition="all 0.3s ease-in-out"
+ >
+ Login
+
+ )}
+
+
+
+ {user && (
+
+
+
+
+
+ setHoverState({ ...hoverState, chat: true })}
+ onMouseLeave={() => setHoverState({ ...hoverState, chat: false, lock: false })}
+ >
+ {user?.isFrozen ? (
+
+ ) : hoverState.lock ? (
+
+ ) : (
+
+ )}
+
+
+ {/* TV Icon - Only visible to admin users */}
+ {user && (
+ setHoverState({ ...hoverState, tv: true })}
+ onMouseLeave={() => setHoverState({ ...hoverState, tv: false })}
+ >
+ {hoverState.tv && !isAdmin ? (
+
+ ) : (
+
+ )}
+
+ )}
+
+
+
+
+
+
+
+ )}
+
+ {!user && (
+ setAuthScreen("signup")}
+ _hover={{
+ color: "teal.500",
+ transform: "scale(1.2)",
+ }}
+ transition="all 0.3s ease-in-out"
+ >
+ Sign up
+
+ )}
+
+ );
};
export default Header;
diff --git a/frontend/src/components/InactivityBackground.jsx b/frontend/src/components/InactivityBackground.jsx
new file mode 100644
index 0000000..a9852ce
--- /dev/null
+++ b/frontend/src/components/InactivityBackground.jsx
@@ -0,0 +1,79 @@
+import React, { useEffect, useState } from 'react';
+import { Canvas } from '@react-three/fiber';
+import { useTheme } from '@chakra-ui/react';
+import Particles from 'react-tsparticles'; // Install using npm or yarn
+
+const InactivityBackground = () => {
+ const theme = useTheme();
+ const isDarkMode = theme.colorMode === 'dark';
+
+ // State to manage inactivity
+ const [isActive, setIsActive] = useState(true);
+
+ useEffect(() => {
+ let timeout;
+
+ const handleActivity = () => {
+ setIsActive(true);
+ clearTimeout(timeout);
+ timeout = setTimeout(() => {
+ setIsActive(false); // Set inactive after 5 seconds
+ }, 5000);
+ };
+
+ // Attach activity listeners
+ window.addEventListener('mousemove', handleActivity);
+ window.addEventListener('keydown', handleActivity);
+
+ return () => {
+ clearTimeout(timeout);
+ window.removeEventListener('mousemove', handleActivity);
+ window.removeEventListener('keydown', handleActivity);
+ };
+ }, []);
+
+ // Particle options
+ const particleOptions = {
+ fpsLimit: 60,
+ particles: {
+ number: { value: 50 },
+ size: { value: { min: 1, max: 3 } },
+ move: {
+ direction: 'random',
+ speed: 1,
+ outModes: { default: 'out' }
+ },
+ color: {
+ value: isDarkMode ? '#FFFFFF' : '#000000',
+ },
+ },
+ detectRetina: true,
+ };
+
+ return (
+
+ {!isActive && (
+
+ )}
+
+
+
+ );
+};
+
+export default InactivityBackground;
diff --git a/frontend/src/components/LoginCard.jsx b/frontend/src/components/LoginCard.jsx
index 4e6d024..4bdfe46 100644
--- a/frontend/src/components/LoginCard.jsx
+++ b/frontend/src/components/LoginCard.jsx
@@ -1,3 +1,4 @@
+// // this is working version one
import {
Flex,
Box,
@@ -46,14 +47,24 @@ export default function LoginCard() {
showToast("Error", data.error, "error");
return;
}
+
+ // Store the user's role in localStorage
+ localStorage.setItem("user-role", data.role); // Store the role for future use
+
+ // Store the entire user data
localStorage.setItem("user-threads", JSON.stringify(data));
- setUser(data);
+ setUser(data); // Update the Recoil state or wherever the user state is managed
+
+ // Show success toast
+ showToast("Success", "Login successful", "success");
+
} catch (error) {
- showToast("Error", error, "error");
+ showToast("Error", error.message || "Login failed", "error");
} finally {
setLoading(false);
}
};
+
return (
@@ -118,7 +129,7 @@ export default function LoginCard() {
Don't have an account?{" "}
setAuthScreen("signup")}>
- Sign up
+ Create a Brookhouse Account
@@ -128,3 +139,5 @@ export default function LoginCard() {
);
}
+
+
diff --git a/frontend/src/components/Message.jsx b/frontend/src/components/Message.jsx
index 2e2d8ea..9316fe1 100644
--- a/frontend/src/components/Message.jsx
+++ b/frontend/src/components/Message.jsx
@@ -1,91 +1,478 @@
-import { Avatar, Box, Flex, Image, Skeleton, Text } from "@chakra-ui/react";
+
+// // this is version one working
+// import {
+// Avatar,
+// Box,
+// IconButton,
+// Flex,
+// Image,
+// Skeleton,
+// Text,
+// } from "@chakra-ui/react";
+// import { selectedConversationAtom } from "../atoms/messagesAtom";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { BsCheck2All } from "react-icons/bs";
+// import { CloseIcon } from "@chakra-ui/icons"; // Import the close icon
+// import { useState } from "react";
+// // List of restricted words
+// const restrictedWords = [
+// // Offensive language
+// "fuck",
+// "shit",
+// "bitch",
+// "cunt",
+// "motherfucker",
+// "asshole",
+// "dick",
+// "pussy",
+// "cock",
+// "slut",
+// "whore",
+// "faggot",
+// "nigger",
+// "chink",
+// "gook",
+// "spic",
+// "raghead",
+// "wetback",
+
+
+// // Derogatory terms
+// "retard",
+// "cripple",
+// "idiot",
+// "moron",
+// "dumbass",
+// "lame",
+// "loser",
+
+
+// // Hate speech
+// "terrorist",
+// "racist",
+// "bigot",
+// "sexist",
+// "homophobe",
+// "xenophobe",
+
+
+// // Insults and slurs
+// "bastard",
+// "scum",
+// "pig",
+// "skank",
+// "tramp",
+// "hoe",
+// "slut",
+// "bimbo",
+
+
+// // Drugs and alcohol
+// "crack",
+// "heroin",
+// "meth",
+// "cocaine",
+// "weed",
+// "marijuana",
+// "pot",
+
+
+// // Sexual content
+// "porn",
+// "sex",
+// "nude",
+// "orgy",
+// "rape",
+// "molest",
+// "incest",
+
+
+// // Offensive phrases
+// "go to hell",
+// "kill yourself",
+// "die",
+// "you're a loser",
+// "eat shit",
+
+
+// // Additional common bad phrases
+// "suck my dick",
+// "blow job",
+// "fist fuck",
+// "cock sucking",
+// "dickhead",
+// ];
+
+
+// // Function to check if a message contains any restricted words
+// const isMessageRestricted = (text) => {
+// return restrictedWords.some((word) => text.toLowerCase().includes(word));
+// };
+// const Message = ({ ownMessage, message, onDelete }) => {
+// const selectedConversation = useRecoilValue(selectedConversationAtom);
+// const user = useRecoilValue(userAtom);
+// const [imgLoaded, setImgLoaded] = useState(false);
+// // Check if the message contains restricted words
+// if (message.text && isMessageRestricted(message.text)) {
+// return (
+//
+//
+// Message contains inappropriate content and was not sent.
+//
+//
+// );
+// }
+// return (
+// <>
+// {ownMessage ? (
+//
+// {message.text && (
+//
+// {/* Start of delete button */}
+// }
+// size="xs" // Extra small button
+// fontSize="10px" // Adjust the icon size to make it smaller
+// variant="ghost" // No background or border
+// colorScheme="whiteAlpha" // Transparent background
+// position="absolute"
+// top="-4px" // Adjust position to fit better
+// right="-4px" // Adjust position to fit better
+// onClick={() => onDelete(message._id)} // Call onDelete with message ID
+// borderRadius="full"
+// aria-label="Delete message"
+// />
+// {/* End of delete button */}
+// {message.text}
+//
+//
+//
+//
+// )}
+// {message.img && !imgLoaded && (
+//
+// setImgLoaded(true)}
+// alt="Message image"
+// borderRadius={4}
+// />
+//
+//
+// )}
+// {message.img && imgLoaded && (
+//
+//
+// {/* Start of delete button */}
+// }
+// size="2xs" // Smaller than extra small
+// fontSize="6px" // Even smaller icon size
+// variant="ghost" // No background or border
+// colorScheme="whiteAlpha" // Transparent background
+// position="absolute"
+// top="-2px" // Keeps the current position
+// right="-2px" // Keeps the current position
+// onClick={() => onDelete(message._id)} // Call onDelete with message ID
+// borderRadius="full"
+// aria-label="Delete message"
+// />
+// {/* End of delete button */}
+//
+//
+//
+//
+// )}
+//
+//
+// ) : (
+//
+//
+// {message.text && (
+//
+// {/* Start of delete button */}
+// }
+// size="2xs" // Smaller than extra small
+// fontSize="6px" // Even smaller icon size
+// variant="ghost" // No background or border
+// colorScheme="whiteAlpha" // Transparent background
+// position="absolute"
+// top="-2px" // Keeps the current position
+// right="-2px" // Keeps the current position
+// onClick={() => onDelete(message._id)} // Call onDelete with message ID
+// borderRadius="full"
+// aria-label="Delete message"
+// />
+// {/* End of delete button */}
+// {message.text}
+//
+// )}
+// {message.img && !imgLoaded && (
+//
+// setImgLoaded(true)}
+// alt="Message image"
+// borderRadius={4}
+// />
+//
+//
+// )}
+// {message.img && imgLoaded && (
+//
+//
+// {/* Start of delete button */}
+// }
+// size="2xs" // Smaller than extra small
+// fontSize="6px" // Even smaller icon size
+// variant="ghost" // No background or border
+// colorScheme="whiteAlpha" // Transparent background
+// position="absolute"
+// top="-2px" // Keeps the current position
+// right="-2px" // Keeps the current position
+// onClick={() => onDelete(message._id)} // Call onDelete with message ID
+// borderRadius="full"
+// aria-label="Delete message"
+// />
+// {/* End of delete button */}
+//
+// )}
+//
+// )}
+// >
+// );
+// };
+// export default Message;
+
+
+
+
+// version 2 with translations
+import {
+ Avatar,
+ Box,
+ IconButton,
+ Flex,
+ Image,
+ Skeleton,
+ Text,
+} from "@chakra-ui/react";
import { selectedConversationAtom } from "../atoms/messagesAtom";
import { useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
import { BsCheck2All } from "react-icons/bs";
-import { useState } from "react";
+import { CloseIcon } from "@chakra-ui/icons";
+import { useState, useEffect } from "react";
+import { useTranslation } from 'react-i18next'; // Add the translation hook
-const Message = ({ ownMessage, message }) => {
- const selectedConversation = useRecoilValue(selectedConversationAtom);
- const user = useRecoilValue(userAtom);
- const [imgLoaded, setImgLoaded] = useState(false);
- return (
- <>
- {ownMessage ? (
-
- {message.text && (
-
- {message.text}
-
-
-
-
- )}
- {message.img && !imgLoaded && (
-
- setImgLoaded(true)}
- alt='Message image'
- borderRadius={4}
- />
-
-
- )}
+// List of restricted words
+const restrictedWords = [
+ // Offensive language
+ "fuck", "shit", "bitch", "cunt", "motherfucker", // ... (rest of the words)
+];
+
+// Function to check if a message contains any restricted words
+const isMessageRestricted = (text) => {
+ return restrictedWords.some((word) => text.toLowerCase().includes(word));
+};
- {message.img && imgLoaded && (
-
-
-
-
-
-
- )}
+const Message = ({ ownMessage, message, onDelete }) => {
+ const selectedConversation = useRecoilValue(selectedConversationAtom);
+ const user = useRecoilValue(userAtom);
+ const [imgLoaded, setImgLoaded] = useState(false);
+ const { t, i18n } = useTranslation(); // Initialize the translation hook
+ const [language, setLanguage] = useState(i18n.language); // State for language
-
-
- ) : (
-
-
+ useEffect(() => {
+ // Update language state whenever the i18n language changes
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
- {message.text && (
-
- {message.text}
-
- )}
- {message.img && !imgLoaded && (
-
- setImgLoaded(true)}
- alt='Message image'
- borderRadius={4}
- />
-
-
- )}
+ i18n.on('languageChanged', handleLanguageChange); // Listen for language change
- {message.img && imgLoaded && (
-
-
-
- )}
-
- )}
- >
- );
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange); // Cleanup on unmount
+ };
+ }, [i18n]);
+
+ // Check if the message contains restricted words
+ if (message.text && isMessageRestricted(message.text)) {
+ return (
+
+
+ {t("Message contains inappropriate content and was not sent.")}
+
+
+ );
+ }
+
+ return (
+ <>
+ {ownMessage ? (
+
+ {message.text && (
+
+ {/* Delete button */}
+ }
+ size="xs"
+ fontSize="10px"
+ variant="ghost"
+ colorScheme="whiteAlpha"
+ position="absolute"
+ top="-4px"
+ right="-4px"
+ onClick={() => onDelete(message._id)}
+ borderRadius="full"
+ aria-label={t("Delete message")}
+ />
+ {message.text}
+
+
+
+
+ )}
+ {message.img && !imgLoaded && (
+
+ setImgLoaded(true)}
+ alt={t("Message image")}
+ borderRadius={4}
+ />
+
+
+ )}
+ {message.img && imgLoaded && (
+
+
+ }
+ size="2xs"
+ fontSize="6px"
+ variant="ghost"
+ colorScheme="whiteAlpha"
+ position="absolute"
+ top="-2px"
+ right="-2px"
+ onClick={() => onDelete(message._id)}
+ borderRadius="full"
+ aria-label={t("Delete message")}
+ />
+
+
+
+
+ )}
+
+
+ ) : (
+
+
+ {message.text && (
+
+ }
+ size="2xs"
+ fontSize="6px"
+ variant="ghost"
+ colorScheme="whiteAlpha"
+ position="absolute"
+ top="-2px"
+ right="-2px"
+ onClick={() => onDelete(message._id)}
+ borderRadius="full"
+ aria-label={t("Delete message")}
+ />
+ {message.text}
+
+ )}
+ {message.img && !imgLoaded && (
+
+ setImgLoaded(true)}
+ alt={t("Message image")}
+ borderRadius={4}
+ />
+
+
+ )}
+ {message.img && imgLoaded && (
+
+
+ }
+ size="2xs"
+ fontSize="6px"
+ variant="ghost"
+ colorScheme="whiteAlpha"
+ position="absolute"
+ top="-2px"
+ right="-2px"
+ onClick={() => onDelete(message._id)}
+ borderRadius="full"
+ aria-label={t("Delete message")}
+ />
+
+ )}
+
+ )}
+ >
+ );
};
export default Message;
+
diff --git a/frontend/src/components/MessageContainer.jsx b/frontend/src/components/MessageContainer.jsx
index 7f60099..ebc130c 100644
--- a/frontend/src/components/MessageContainer.jsx
+++ b/frontend/src/components/MessageContainer.jsx
@@ -1,163 +1,216 @@
-import { Avatar, Divider, Flex, Image, Skeleton, SkeletonCircle, Text, useColorModeValue } from "@chakra-ui/react";
+import {
+ Avatar,
+ Divider,
+ Flex,
+ Image,
+ Skeleton,
+ SkeletonCircle,
+ Text,
+ useColorModeValue,
+} from "@chakra-ui/react";
import Message from "./Message";
import MessageInput from "./MessageInput";
import { useEffect, useRef, useState } from "react";
import useShowToast from "../hooks/useShowToast";
-import { conversationsAtom, selectedConversationAtom } from "../atoms/messagesAtom";
+import {
+ conversationsAtom,
+ selectedConversationAtom,
+} from "../atoms/messagesAtom";
import { useRecoilValue, useSetRecoilState } from "recoil";
import userAtom from "../atoms/userAtom";
import { useSocket } from "../context/SocketContext.jsx";
import messageSound from "../assets/sounds/message.mp3";
+
const MessageContainer = () => {
- const showToast = useShowToast();
- const selectedConversation = useRecoilValue(selectedConversationAtom);
- const [loadingMessages, setLoadingMessages] = useState(true);
- const [messages, setMessages] = useState([]);
- const currentUser = useRecoilValue(userAtom);
- const { socket } = useSocket();
- const setConversations = useSetRecoilState(conversationsAtom);
- const messageEndRef = useRef(null);
-
- useEffect(() => {
- socket.on("newMessage", (message) => {
- if (selectedConversation._id === message.conversationId) {
- setMessages((prev) => [...prev, message]);
- }
-
- // make a sound if the window is not focused
- if (!document.hasFocus()) {
- const sound = new Audio(messageSound);
- sound.play();
- }
-
- setConversations((prev) => {
- const updatedConversations = prev.map((conversation) => {
- if (conversation._id === message.conversationId) {
- return {
- ...conversation,
- lastMessage: {
- text: message.text,
- sender: message.sender,
- },
- };
- }
- return conversation;
- });
- return updatedConversations;
- });
- });
-
- return () => socket.off("newMessage");
- }, [socket, selectedConversation, setConversations]);
-
- useEffect(() => {
- const lastMessageIsFromOtherUser = messages.length && messages[messages.length - 1].sender !== currentUser._id;
- if (lastMessageIsFromOtherUser) {
- socket.emit("markMessagesAsSeen", {
- conversationId: selectedConversation._id,
- userId: selectedConversation.userId,
- });
- }
-
- socket.on("messagesSeen", ({ conversationId }) => {
- if (selectedConversation._id === conversationId) {
- setMessages((prev) => {
- const updatedMessages = prev.map((message) => {
- if (!message.seen) {
- return {
- ...message,
- seen: true,
- };
- }
- return message;
- });
- return updatedMessages;
- });
- }
- });
- }, [socket, currentUser._id, messages, selectedConversation]);
-
- useEffect(() => {
- messageEndRef.current?.scrollIntoView({ behavior: "smooth" });
- }, [messages]);
-
- useEffect(() => {
- const getMessages = async () => {
- setLoadingMessages(true);
- setMessages([]);
- try {
- if (selectedConversation.mock) return;
- const res = await fetch(`/api/messages/${selectedConversation.userId}`);
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- setMessages(data);
- } catch (error) {
- showToast("Error", error.message, "error");
- } finally {
- setLoadingMessages(false);
- }
- };
-
- getMessages();
- }, [showToast, selectedConversation.userId, selectedConversation.mock]);
-
- return (
-
- {/* Message header */}
-
-
-
- {selectedConversation.username}
-
-
-
-
-
-
- {loadingMessages &&
- [...Array(5)].map((_, i) => (
-
- {i % 2 === 0 && }
-
-
-
-
-
- {i % 2 !== 0 && }
-
- ))}
-
- {!loadingMessages &&
- messages.map((message) => (
-
-
-
- ))}
-
-
-
-
- );
+ const showToast = useShowToast();
+ const selectedConversation = useRecoilValue(selectedConversationAtom);
+ const [loadingMessages, setLoadingMessages] = useState(true);
+ const [messages, setMessages] = useState([]);
+ const currentUser = useRecoilValue(userAtom);
+ const { socket } = useSocket();
+ const setConversations = useSetRecoilState(conversationsAtom);
+ const messageEndRef = useRef(null);
+
+ // Function to handle message deletion
+ const handleDelete = async (messageId) => {
+ try {
+ // Make an API call to delete the message from the backend
+ const res = await fetch(`/api/messages/${messageId}`, {
+ method: "DELETE",
+ });
+
+ if (!res.ok) {
+ throw new Error("Failed to delete the message.");
+ }
+
+ // Update local state to remove the deleted message
+ setMessages((prev) =>
+ prev.filter((message) => message._id !== messageId)
+ );
+ showToast("Success", "Message deleted successfully.", "success");
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ }
+ };
+
+ // Socket event handlers for new messages and marking messages as seen
+ useEffect(() => {
+ socket.on("newMessage", (message) => {
+ if (selectedConversation._id === message.conversationId) {
+ setMessages((prev) => [...prev, message]);
+ }
+
+ if (!document.hasFocus()) {
+ const sound = new Audio(messageSound);
+ sound.play();
+ }
+
+ setConversations((prev) => {
+ const updatedConversations = prev.map((conversation) => {
+ if (conversation._id === message.conversationId) {
+ return {
+ ...conversation,
+ lastMessage: {
+ text: message.text,
+ sender: message.sender,
+ },
+ };
+ }
+ return conversation;
+ });
+ return updatedConversations;
+ });
+ });
+
+ return () => socket.off("newMessage");
+ }, [socket, selectedConversation, setConversations]);
+
+ useEffect(() => {
+ const lastMessageIsFromOtherUser =
+ messages.length &&
+ messages[messages.length - 1].sender !== currentUser._id;
+ if (lastMessageIsFromOtherUser) {
+ socket.emit("markMessagesAsSeen", {
+ conversationId: selectedConversation._id,
+ userId: selectedConversation.userId,
+ });
+ }
+
+ socket.on("messagesSeen", ({ conversationId }) => {
+ if (selectedConversation._id === conversationId) {
+ setMessages((prev) => {
+ const updatedMessages = prev.map((message) => {
+ if (!message.seen) {
+ return {
+ ...message,
+ seen: true,
+ };
+ }
+ return message;
+ });
+ return updatedMessages;
+ });
+ }
+ });
+ }, [socket, currentUser._id, messages, selectedConversation]);
+
+ useEffect(() => {
+ messageEndRef.current?.scrollIntoView({ behavior: "smooth" });
+ }, [messages]);
+
+ useEffect(() => {
+ const getMessages = async () => {
+ setLoadingMessages(true);
+ setMessages([]);
+ try {
+ if (selectedConversation.mock) return;
+ const res = await fetch(`/api/messages/${selectedConversation.userId}`);
+ const data = await res.json();
+ if (data.error) {
+ showToast("Error", data.error, "error");
+ return;
+ }
+ setMessages(data);
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ } finally {
+ setLoadingMessages(false);
+ }
+ };
+
+ getMessages();
+ }, [showToast, selectedConversation.userId, selectedConversation.mock]);
+
+ return (
+
+ {/* Message header */}
+
+
+
+ {selectedConversation.username}{" "}
+
+
+
+
+
+
+
+ {loadingMessages &&
+ [...Array(5)].map((_, i) => (
+
+ {i % 2 === 0 && }
+
+
+
+
+
+ {i % 2 !== 0 && }
+
+ ))}
+
+ {!loadingMessages &&
+ messages.map((message) => (
+
+
+
+ ))}
+
+
+
+
+ );
};
export default MessageContainer;
diff --git a/frontend/src/components/MessageInput.jsx b/frontend/src/components/MessageInput.jsx
index d4a708b..766135e 100644
--- a/frontend/src/components/MessageInput.jsx
+++ b/frontend/src/components/MessageInput.jsx
@@ -1,3 +1,4 @@
+// this is the first version without the redisign working
import {
Flex,
Image,
@@ -130,3 +131,6 @@ const MessageInput = ({ setMessages }) => {
};
export default MessageInput;
+
+
+// this is version 2 with the redesign
diff --git a/frontend/src/components/Post.jsx b/frontend/src/components/Post.jsx
index 3416265..2eaf147 100644
--- a/frontend/src/components/Post.jsx
+++ b/frontend/src/components/Post.jsx
@@ -1,3 +1,160 @@
+//version 1 working
+// import { Avatar } from "@chakra-ui/avatar";
+// import { Image } from "@chakra-ui/image";
+// import { Box, Flex, Text } from "@chakra-ui/layout";
+// import { Link, useNavigate } from "react-router-dom";
+// import Actions from "./Actions";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import { formatDistanceToNow } from "date-fns";
+// import { DeleteIcon } from "@chakra-ui/icons";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import postsAtom from "../atoms/postsAtom";
+
+// const Post = ({ post, postedBy }) => {
+// const [user, setUser] = useState(null);
+// const showToast = useShowToast();
+// const currentUser = useRecoilValue(userAtom);
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const navigate = useNavigate();
+
+// useEffect(() => {
+// const getUser = async () => {
+// try {
+// const res = await fetch("/api/users/profile/" + postedBy);
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// setUser(data);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// setUser(null);
+// }
+// };
+
+// getUser();
+// }, [postedBy, showToast]);
+
+// const handleDeletePost = async (e) => {
+// try {
+// e.preventDefault();
+// if (!window.confirm("Are you sure you want to delete this post?")) return;
+
+// const res = await fetch(`/api/posts/${post._id}`, {
+// method: "DELETE",
+// });
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// showToast("Success", "Post deleted", "success");
+// setPosts(posts.filter((p) => p._id !== post._id));
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// }
+// };
+
+// if (!user) return null;
+// return (
+//
+//
+//
+// {
+// e.preventDefault();
+// navigate(`/${user.username}`);
+// }}
+// />
+//
+//
+// {post.replies.length === 0 && 🍐}
+// {post.replies[0] && (
+//
+// )}
+
+// {post.replies[1] && (
+//
+// )}
+
+// {post.replies[2] && (
+//
+// )}
+//
+//
+//
+//
+//
+// {
+// e.preventDefault();
+// navigate(`/${user.username}`);
+// }}
+// >
+// {user?.username}
+//
+//
+//
+//
+//
+// {formatDistanceToNow(new Date(post.createdAt))} ago
+//
+
+// {currentUser?._id === user._id && }
+//
+//
+
+// {post.text}
+// {post.img && (
+//
+//
+//
+// )}
+
+//
+//
+//
+//
+//
+//
+// );
+// };
+
+// export default Post;
+
+// version 2 with translations working
import { Avatar } from "@chakra-ui/avatar";
import { Image } from "@chakra-ui/image";
import { Box, Flex, Text } from "@chakra-ui/layout";
@@ -10,145 +167,211 @@ import { DeleteIcon } from "@chakra-ui/icons";
import { useRecoilState, useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
import postsAtom from "../atoms/postsAtom";
+import { useTranslation } from "react-i18next";
+
+const Post = ({ post, postedBy, isTV = false }) => {
+ const [user, setUser] = useState(null);
+ const showToast = useShowToast();
+ const currentUser = useRecoilValue(userAtom);
+ const [posts, setPosts] = useRecoilState(postsAtom);
+ const navigate = useNavigate();
+ const { t, i18n } = useTranslation();
+ const [language, setLanguage] = useState(i18n.language);
+ useEffect(() => {
+ // Update the language state whenever the i18n language changes
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on("languageChanged", handleLanguageChange); // Listen for language change
+
+ return () => {
+ i18n.off("languageChanged", handleLanguageChange); // Cleanup on component unmount
+ };
+ }, [i18n]);
+
+ useEffect(() => {
+ const getUser = async () => {
+ console.log("postedBy:", postedBy);
+
+ try {
+ const userId = typeof postedBy === "object" ? postedBy._id : postedBy; // Extract ID if postedBy is an object
+ const res = await fetch("/api/users/profile/" + userId); // Use userId directly in the URL
+ const data = await res.json();
+ if (data.error) {
+ showToast(t("Error"), data.error, "error");
+ return;
+ }
+ setUser(data);
+ } catch (error) {
+ showToast(t("Error"), error.message, "error");
+ setUser(null);
+ }
+ };
+
+ getUser();
+ }, [postedBy, showToast, t]);
+
+ const handleDeletePost = async (e) => {
+ try {
+ e.preventDefault();
+ if (!window.confirm(t("Are you sure you want to delete this post?")))
+ return;
+
+ const res = await fetch(`/api/posts/${post._id}`, {
+ method: "DELETE",
+ headers: {
+ Authorization: `Bearer ${currentUser.token}`, // Add authorization header
+ },
+ });
+ const data = await res.json();
+ if (data.error) {
+ showToast(t("Error deleting post"), data.error, "error");
+ return;
+ }
+ showToast(t("Success"), t("Post deleted"), "success");
+ setPosts(posts.filter((p) => p._id !== post._id));
+ } catch (error) {
+ showToast(t("Error"), error.message, "error");
+ }
+ };
+
+ if (!user) return null;
+
+ const tvStyles = isTV ? {
+ maxWidth: "90vw",
+ margin: "0 auto",
+ padding: "2rem",
+ fontSize: "1.5rem",
+ ".post-text": {
+ fontSize: "2rem",
+ lineHeight: "1.5",
+ },
+ ".post-image": {
+ maxHeight: "80vh",
+ objectFit: "contain",
+ },
+ ".user-avatar": {
+ width: "80px",
+ height: "80px",
+ }
+ } : {};
+
+ return (
+
+
+
+ {
+ e.preventDefault();
+ navigate(`/${user.username}`);
+ }}
+ />
+
+
+ {post.replies.length === 0 && 🍐}
+ {post.replies[0] && (
+
+ )}
+
+ {post.replies[1] && (
+
+ )}
+
+ {post.replies[2] && (
+
+ )}
+
+
+
+
+
+ {
+ e.preventDefault();
+ navigate(`/${user.username}`);
+ }}
+ >
+ {user?.username}
+
+
+
+
+
+ {formatDistanceToNow(new Date(post.createdAt))} {t("ago")}
+
+
+ {!isTV && (currentUser?._id === user._id || currentUser?.role === "admin") && (
+
+ )}
+
+
+
+
+ {post.text}
+
+ {post.img && (
+
+
+
+ )}
-const Post = ({ post, postedBy }) => {
- const [user, setUser] = useState(null);
- const showToast = useShowToast();
- const currentUser = useRecoilValue(userAtom);
- const [posts, setPosts] = useRecoilState(postsAtom);
- const navigate = useNavigate();
-
- useEffect(() => {
- const getUser = async () => {
- try {
- const res = await fetch("/api/users/profile/" + postedBy);
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- setUser(data);
- } catch (error) {
- showToast("Error", error.message, "error");
- setUser(null);
- }
- };
-
- getUser();
- }, [postedBy, showToast]);
-
- const handleDeletePost = async (e) => {
- try {
- e.preventDefault();
- if (!window.confirm("Are you sure you want to delete this post?")) return;
-
- const res = await fetch(`/api/posts/${post._id}`, {
- method: "DELETE",
- });
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- showToast("Success", "Post deleted", "success");
- setPosts(posts.filter((p) => p._id !== post._id));
- } catch (error) {
- showToast("Error", error.message, "error");
- }
- };
-
- if (!user) return null;
- return (
-
-
-
- {
- e.preventDefault();
- navigate(`/${user.username}`);
- }}
- />
-
-
- {post.replies.length === 0 && 🥱}
- {post.replies[0] && (
-
- )}
-
- {post.replies[1] && (
-
- )}
-
- {post.replies[2] && (
-
- )}
-
-
-
-
-
- {
- e.preventDefault();
- navigate(`/${user.username}`);
- }}
- >
- {user?.username}
-
-
-
-
-
- {formatDistanceToNow(new Date(post.createdAt))} ago
-
-
- {currentUser?._id === user._id && }
-
-
-
- {post.text}
- {post.img && (
-
-
-
- )}
-
-
-
-
-
-
-
- );
+ {!isTV && (
+
+
+
+ )}
+
+
+
+ );
};
-export default Post;
+export default Post;
\ No newline at end of file
diff --git a/frontend/src/components/ReviewModal.jsx b/frontend/src/components/ReviewModal.jsx
new file mode 100644
index 0000000..8762ecd
--- /dev/null
+++ b/frontend/src/components/ReviewModal.jsx
@@ -0,0 +1,222 @@
+import { useEffect, useState } from 'react';
+import {
+ Modal,
+ ModalOverlay,
+ ModalContent,
+ ModalHeader,
+ ModalBody,
+ ModalFooter,
+ Button,
+ Text,
+ Box,
+ useColorModeValue,
+ Image,
+ VStack,
+ Divider,
+ Badge,
+ useToast,
+ Spinner
+} from "@chakra-ui/react";
+import { useRecoilValue } from "recoil";
+import userAtom from "../atoms/userAtom";
+
+const ReviewModal = () => {
+ const [isOpen, setIsOpen] = useState(false);
+ const [currentReview, setCurrentReview] = useState(null);
+ const [isLoading, setIsLoading] = useState(false);
+ const [isFetching, setIsFetching] = useState(false);
+ const user = useRecoilValue(userAtom);
+ const toast = useToast();
+ const bgColor = useColorModeValue("white", "gray.800");
+
+ // Add function to check auth status
+ const checkAuthStatus = () => {
+ if (!user || !user._id) {
+ console.error("User not authenticated");
+ return false;
+ }
+ return true;
+ };
+
+ const checkForPendingReviews = async () => {
+ if (isFetching || !checkAuthStatus()) return;
+
+ setIsFetching(true);
+ try {
+ const res = await fetch("/api/posts/pending-reviews", {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json",
+ // Add Authorization header if you're using JWT
+ // "Authorization": `Bearer ${localStorage.getItem('token')}`,
+ },
+ credentials: 'include'
+ });
+
+ if (res.status === 401) {
+ console.error("Authentication error - user not authorized");
+ toast({
+ title: "Authentication Error",
+ description: "Please try logging out and logging back in",
+ status: "error",
+ duration: 5000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ if (!res.ok) {
+ throw new Error(`HTTP error! status: ${res.status}`);
+ }
+
+ const data = await res.json();
+ console.log("Pending reviews response:", data);
+
+ if (data.length > 0 && !isOpen) {
+ setCurrentReview(data[0]);
+ setIsOpen(true);
+ }
+ } catch (error) {
+ console.error("Error checking reviews:", error);
+ toast({
+ title: "Error",
+ description: error.message || "Failed to fetch pending reviews",
+ status: "error",
+ duration: 5000,
+ isClosable: true,
+ });
+ } finally {
+ setIsFetching(false);
+ }
+ };
+
+ const handleReview = async (decision) => {
+ if (!currentReview?._id || !checkAuthStatus()) return;
+
+ setIsLoading(true);
+ try {
+ const res = await fetch(`/api/posts/review/${currentReview._id}`, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ // Add Authorization header if you're using JWT
+ // "Authorization": `Bearer ${localStorage.getItem('token')}`,
+ },
+ credentials: 'include',
+ body: JSON.stringify({
+ decision,
+ reviewerId: user._id // Add reviewer ID explicitly
+ })
+ });
+
+ if (res.status === 401) {
+ throw new Error("Authentication error - please log in again");
+ }
+
+ if (!res.ok) {
+ const errorData = await res.json();
+ throw new Error(errorData.error || `HTTP error! status: ${res.status}`);
+ }
+
+ const data = await res.json();
+
+ toast({
+ title: "Success",
+ description: `Post ${decision === 'approved' ? 'approved' : 'rejected'} successfully`,
+ status: "success",
+ duration: 3000,
+ isClosable: true,
+ });
+
+ setIsOpen(false);
+ setCurrentReview(null);
+
+ // Check for more pending reviews
+ setTimeout(checkForPendingReviews, 1000);
+ } catch (error) {
+ console.error("Error submitting review:", error);
+ toast({
+ title: "Error",
+ description: error.message,
+ status: "error",
+ duration: 5000,
+ isClosable: true,
+ });
+
+ // If authentication error, you might want to trigger a re-login
+ if (error.message.includes("Authentication error")) {
+ // Implement your logout/redirect logic here
+ }
+ } finally {
+ setIsLoading(false);
+ }
+ };
+
+ useEffect(() => {
+ if (user && (user.role === "admin" || user.role === "teacher")) {
+ checkForPendingReviews();
+ const interval = setInterval(checkForPendingReviews, 30000);
+ return () => clearInterval(interval);
+ }
+ }, [user]);
+
+ if (!currentReview) return null;
+
+ return (
+ setIsOpen(false)} closeOnOverlayClick={false}>
+
+
+ Review Post
+
+ {isFetching ? (
+
+
+ Loading review...
+
+ ) : (
+
+
+
+ Posted by: {currentReview.postedBy?.username || 'Unknown'}
+
+ Student Post
+
+
+ {currentReview.text}
+
+ {currentReview.img && (
+
+ )}
+
+
+
+
+ As a {user.role}, your review decision will help determine if this post should be published.
+
+
+ )}
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ReviewModal;
\ No newline at end of file
diff --git a/frontend/src/components/SignupCard.jsx b/frontend/src/components/SignupCard.jsx
index 9555d00..f44309d 100644
--- a/frontend/src/components/SignupCard.jsx
+++ b/frontend/src/components/SignupCard.jsx
@@ -1,145 +1,1355 @@
+// // this is the originl
+// import {
+// Flex,
+// Box,
+// FormControl,
+// FormLabel,
+// Input,
+// InputGroup,
+// HStack,
+// InputRightElement,
+// Stack,
+// Button,
+// Heading,
+// Text,
+// useColorModeValue,
+// Link,
+// Select,
+// Checkbox,
+// } from "@chakra-ui/react";
+// import { useState } from "react";
+// import { ViewIcon, ViewOffIcon } from "@chakra-ui/icons";
+// import { useSetRecoilState } from "recoil";
+// import authScreenAtom from "../atoms/authAtom";
+// import useShowToast from "../hooks/useShowToast";
+// import userAtom from "../atoms/userAtom";
+
+// export default function SignupCard() {
+// const [showPassword, setShowPassword] = useState(false);
+// const [isStudent, setIsStudent] = useState(false);
+// const [yearGroup, setYearGroup] = useState("");
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const [inputs, setInputs] = useState({
+// name: "",
+// username: "",
+// email: "",
+// password: "",
+// });
+
+// const showToast = useShowToast();
+// const setUser = useSetRecoilState(userAtom);
+
+// const handleSignup = async () => {
+// try {
+// const res = await fetch("/api/users/signup", {
+// method: "POST",
+// headers: {
+// "Content-Type": "application/json",
+// },
+// body: JSON.stringify({
+// ...inputs,
+// yearGroup: isStudent ? yearGroup : null, // Include year group only if they are a student
+// }),
+// });
+// const data = await res.json();
+
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+
+// localStorage.setItem("user-threads", JSON.stringify(data));
+// setUser(data);
+// } catch (error) {
+// showToast("Error", error, "error");
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// Sign up
+//
+//
+//
+//
+//
+//
+//
+// Full name
+// setInputs({ ...inputs, name: e.target.value })}
+// value={inputs.name}
+// />
+//
+//
+//
+//
+// Username
+// setInputs({ ...inputs, username: e.target.value })}
+// value={inputs.username}
+// />
+//
+//
+//
+//
+// Email address
+// setInputs({ ...inputs, email: e.target.value })}
+// value={inputs.email}
+// />
+//
+//
+// Password
+//
+// setInputs({ ...inputs, password: e.target.value })}
+// value={inputs.password}
+// />
+//
+//
+//
+//
+//
+
+// {/* Checkbox for Are You a Student? */}
+//
+// setIsStudent(e.target.checked)}>
+// Are you a student?
+//
+//
+
+// {/* Year Group Selection */}
+// {isStudent && (
+//
+// Select Year Group
+//
+//
+// )}
+
+//
+//
+//
+//
+//
+// Already a user?{" "}
+// setAuthScreen("login")}>
+// Login
+//
+//
+//
+//
+//
+//
+//
+// );
+// }
+
+// admin role update(working)
+// import React, { useState } from "react";
+// import {
+// Flex,
+// Box,
+// FormControl,
+// FormLabel,
+// Input,
+// InputGroup,
+// HStack,
+// InputRightElement,
+// Stack,
+// Button,
+// Heading,
+// Text,
+// useColorModeValue,
+// Link,
+// Select,
+// Checkbox,
+// } from "@chakra-ui/react";
+// import { ViewIcon, ViewOffIcon } from "@chakra-ui/icons";
+// import { useSetRecoilState } from "recoil";
+// import authScreenAtom from "../atoms/authAtom";
+// import useShowToast from "../hooks/useShowToast";
+// import userAtom from "../atoms/userAtom";
+
+// const SignupCard = () => {
+// const [showPassword, setShowPassword] = useState(false);
+// const [isStudent, setIsStudent] = useState(false);
+// const [isTeacher, setIsTeacher] = useState(false);
+// const [yearGroup, setYearGroup] = useState("");
+// const [department, setDepartment] = useState("");
+// const [inputs, setInputs] = useState({
+// name: "",
+// username: "",
+// email: "",
+// password: "",
+// });
+
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const showToast = useShowToast();
+// const setUser = useSetRecoilState(userAtom);
+
+// const handleSignup = async () => {
+// try {
+// const role =
+// isStudent && yearGroup ? "student" :
+// isTeacher && department ? "teacher" :
+// (inputs.email.toLowerCase().includes("admin") ||
+// inputs.username.toLowerCase().includes("admin")) ? "admin" :
+// "student";
+
+// const signupData = {
+// name: inputs.name,
+// email: inputs.email,
+// username: inputs.username,
+// password: inputs.password,
+// role,
+// ...(role === "student" ? { yearGroup } : {}),
+// ...(role === "teacher" ? { department } : {}),
+// };
+
+// const res = await fetch("/api/users/signup", {
+// method: "POST",
+// headers: {
+// "Content-Type": "application/json",
+// },
+// body: JSON.stringify(signupData),
+// });
+
+// const data = await res.json();
+
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+
+// console.log("Signup successful:", data);
+// localStorage.setItem("user-threads", JSON.stringify(data));
+// setUser(data);
+// } catch (error) {
+// console.error("Error in handleSignup:", error);
+// showToast("Error", error.message, "error");
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// Sign up
+//
+//
+//
+//
+//
+//
+//
+// Full name
+// setInputs({ ...inputs, name: e.target.value })}
+// value={inputs.name}
+// />
+//
+//
+//
+//
+// Username
+// setInputs({ ...inputs, username: e.target.value })}
+// value={inputs.username}
+// />
+//
+//
+//
+//
+// Email address
+// setInputs({ ...inputs, email: e.target.value })}
+// value={inputs.email}
+// />
+//
+//
+// Password
+//
+// setInputs({ ...inputs, password: e.target.value })}
+// value={inputs.password}
+// />
+//
+//
+//
+//
+//
+
+// {/* Role Selection */}
+//
+// setIsStudent(e.target.checked)}>
+// Are you a student?
+//
+// setIsTeacher(e.target.checked)}>
+// Are you a teacher?
+//
+//
+
+// {/* Year Group Selection (Visible only for students) */}
+// {isStudent && (
+//
+// Select Year Group
+//
+//
+// )}
+// {/* Department Selection (Visible only for teachers) */}
+// {isTeacher && (
+//
+// Select Department
+//
+//
+// )}
+
+//
+//
+//
+//
+//
+// Already a user?{" "}
+// setAuthScreen("login")}>
+// Login
+//
+//
+//
+//
+//
+//
+//
+// );
+// };
+
+// export default SignupCard;
+
+// // email verification update(working)
+// import React, { useState, useEffect } from "react";
+// import {
+// Flex,
+// Box,
+// FormControl,
+// FormLabel,
+// Input,
+// InputGroup,
+// HStack,
+// InputRightElement,
+// Stack,
+// Button,
+// Heading,
+// Text,
+// useColorModeValue,
+// Link,
+// Select,
+// Checkbox,
+// } from "@chakra-ui/react";
+// import { ViewIcon, ViewOffIcon } from "@chakra-ui/icons";
+// import { useSetRecoilState } from "recoil";
+// import authScreenAtom from "../atoms/authAtom";
+// import useShowToast from "../hooks/useShowToast";
+// import userAtom from "../atoms/userAtom";
+// import axios from "axios";
+
+// const SignupCard = () => {
+// const [showPassword, setShowPassword] = useState(false);
+// const [isStudent, setIsStudent] = useState(false);
+// const [isTeacher, setIsTeacher] = useState(false);
+// const [yearGroup, setYearGroup] = useState("");
+// const [department, setDepartment] = useState("");
+// const [inputs, setInputs] = useState({
+// name: "",
+// username: "",
+// email: "",
+// password: "",
+// });
+// const [formData, setFormData] = useState({
+// otp: "",
+// });
+// const [isOtpSent, setIsOtpSent] = useState(false);
+// const [isOtpVerified, setIsOtpVerified] = useState(false);
+// const [timer, setTimer] = useState(120);
+// const [errorMessage, setErrorMessage] = useState("");
+// const [isResendDisabled, setIsResendDisabled] = useState(true);
+
+// const setAuthScreen = useSetRecoilState(authScreenAtom);
+// const showToast = useShowToast();
+// const setUser = useSetRecoilState(userAtom);
+
+// useEffect(() => {
+// let interval;
+// if (isOtpSent && timer > 0) {
+// interval = setInterval(() => {
+// setTimer((prev) => {
+// if (prev <= 1) {
+// setIsResendDisabled(false);
+// return 0;
+// }
+// return prev - 1;
+// });
+// }, 1000);
+// }
+// return () => clearInterval(interval);
+// }, [isOtpSent, timer]);
+
+// const handleChange = (e) => {
+// setFormData({ ...formData, [e.target.name]: e.target.value });
+// };
+
+// const sendOtp = async (isResend = false) => {
+// try {
+// const role =
+// isStudent && yearGroup
+// ? "student"
+// : isTeacher && department
+// ? "teacher"
+// : inputs.email.toLowerCase().includes("pear")
+// ? "admin"
+// : "student";
+
+// const signupData = {
+// name: inputs.name,
+// email: inputs.email,
+// username: inputs.username,
+// password: inputs.password,
+// role,
+// ...(role === "student" ? { yearGroup } : {}),
+// ...(role === "teacher" ? { department } : {})
+// };
+
+// if (isResend) {
+// await axios.post("/api/users/resend-otp", { email: inputs.email });
+// } else {
+// await axios.post("/api/users/signup", signupData);
+// }
+
+// setIsOtpSent(true);
+// setTimer(120);
+// setIsResendDisabled(true);
+// showToast("Success", `OTP ${isResend ? 're-' : ''}sent to your email`, "success");
+// } catch (error) {
+// console.error("Error sending OTP:", error.response?.data || error.message);
+// setErrorMessage(error.response?.data?.error || "Error sending OTP");
+// showToast("Error", errorMessage, "error");
+// }
+// };
+
+// const verifyOtp = async () => {
+// try {
+// const numericOTP = parseInt(formData.otp, 10);
+// if (isNaN(numericOTP)) {
+// setErrorMessage("OTP must be a numeric value");
+// return;
+// }
+
+// const response = await axios.post("/api/users/verify-otp", {
+// email: inputs.email,
+// otp: numericOTP,
+// });
+
+// setIsOtpVerified(true);
+// setErrorMessage("");
+// showToast("Success", "OTP verified successfully", "success");
+// } catch (error) {
+// console.error("Verify OTP error:", error.response?.data?.error || error.message);
+// setErrorMessage(error.response?.data?.error || "Failed to verify OTP");
+
+// if (error.response?.status === 429) {
+// setIsOtpSent(false);
+// setFormData({ otp: "" });
+// }
+// }
+// };
+
+// const handleSignup = async () => {
+// if (!isOtpVerified) {
+// setErrorMessage("Please verify your OTP before signing up");
+// return;
+// }
+
+// try {
+// const res = await fetch("/api/users/login", {
+// method: "POST",
+// headers: { "Content-Type": "application/json" },
+// body: JSON.stringify({
+// username: inputs.username,
+// password: inputs.password,
+// }),
+// });
+
+// const data = await res.json();
+
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+
+// localStorage.setItem("user-threads", JSON.stringify(data));
+// setUser(data);
+// showToast("Success", "Signup successful!", "success");
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// Sign up
+//
+//
+//
+//
+//
+//
+//
+// Full name
+//
+// setInputs({ ...inputs, name: e.target.value })
+// }
+// value={inputs.name}
+// />
+//
+//
+//
+//
+// Username
+//
+// setInputs({ ...inputs, username: e.target.value })
+// }
+// value={inputs.username}
+// />
+//
+//
+//
+//
+// Email address
+//
+// setInputs({ ...inputs, email: e.target.value })
+// }
+// value={inputs.email}
+// />
+//
+//
+// Password
+//
+//
+// setInputs({ ...inputs, password: e.target.value })
+// }
+// value={inputs.password}
+// />
+//
+//
+//
+//
+//
+
+//
+// setIsStudent(e.target.checked)}
+// >
+// Are you a student?
+//
+// setIsTeacher(e.target.checked)}
+// >
+// Are you a teacher?
+//
+//
+
+// {isStudent && (
+//
+// Select Year Group
+//
+//
+// )}
+
+// {isTeacher && (
+//
+// Select Department
+//
+//
+// )}
+
+// {!isOtpSent && (
+//
+// )}
+
+// {isOtpSent && (
+//
+// Enter OTP
+//
+//
+//
+//
+//
+// {errorMessage && {errorMessage}}
+//
+// )}
+
+//
+//
+//
+
+//
+//
+// Already a user?{" "}
+// setAuthScreen("login")}>
+// Login
+//
+//
+//
+//
+//
+//
+//
+// );
+// };
+
+// export default SignupCard;
+
+// this is the brookhouse update and stuff
+import React, { useState, useEffect } from "react";
import {
- Flex,
- Box,
- FormControl,
- FormLabel,
- Input,
- InputGroup,
- HStack,
- InputRightElement,
- Stack,
- Button,
- Heading,
- Text,
- useColorModeValue,
- Link,
+ Flex,
+ Box,
+ FormControl,
+ FormLabel,
+ Input,
+ InputGroup,
+ HStack,
+ InputRightElement,
+ Stack,
+ Button,
+ Heading,
+ Text,
+ useColorModeValue,
+ Link,
+ Select,
+ Checkbox,
+ FormErrorMessage,
} from "@chakra-ui/react";
-import { useState } from "react";
import { ViewIcon, ViewOffIcon } from "@chakra-ui/icons";
import { useSetRecoilState } from "recoil";
import authScreenAtom from "../atoms/authAtom";
import useShowToast from "../hooks/useShowToast";
import userAtom from "../atoms/userAtom";
+import axios from "axios";
+
+const SignupCard = () => {
+ const [showPassword, setShowPassword] = useState(false);
+ const [isStudent, setIsStudent] = useState(false);
+ const [isTeacher, setIsTeacher] = useState(false);
+ const [isAdmin, setIsAdmin] = useState(false);
+ const [yearGroup, setYearGroup] = useState("");
+ const [department, setDepartment] = useState("");
+ const [inputs, setInputs] = useState({
+ name: "",
+ username: "",
+ email: "",
+ password: "",
+ });
+ const [formData, setFormData] = useState({
+ otp: "",
+ });
+ const [isOtpSent, setIsOtpSent] = useState(false);
+ const [isOtpVerified, setIsOtpVerified] = useState(false);
+ const [timer, setTimer] = useState(180); // 3 minutes in seconds
+ const [isResendDisabled, setIsResendDisabled] = useState(true);
+ const [resendAttempts, setResendAttempts] = useState(0);
+ const [errorMessage, setErrorMessage] = useState("");
+ const [emailError, setEmailError] = useState("");
+ const [usernameError, setUsernameError] = useState("");
+ const [campus, setCampus] = useState("");
+
+ const setAuthScreen = useSetRecoilState(authScreenAtom);
+ const showToast = useShowToast();
+ const setUser = useSetRecoilState(userAtom);
+
+ // Keep all existing validation functions and effects
+ const validateEmailFormat = (email) => {
+ if (!email) return "Email is required";
+
+ const emailLower = email.toLowerCase();
+
+ // Allow pear admin emails
+ if (emailLower.includes("pear")) {
+ return "";
+ }
+
+ // Check for Brookhouse domain
+ if (!emailLower.includes("brookhouse.ac.ke")) {
+ return "Please use your Brookhouse email address";
+ }
+
+ return "";
+ };
+
+ const validateUsernameFormat = (username, email) => {
+ if (!username || !email) return "";
+
+ const emailLower = email.toLowerCase();
+
+ // Special case for pear admin accounts
+ if (emailLower.includes("pear")) {
+ if (!username.toLowerCase().includes("pear")) {
+ return 'Admin usernames must contain "pear"';
+ }
+ return "";
+ }
+
+ // Extract surname from email (everything after first letter before @)
+ const userIdentifier = emailLower.split("@")[0];
+ const surname = userIdentifier.slice(1);
+
+ if (!username.toLowerCase().includes(surname.toLowerCase())) {
+ return `Username must contain your surname (${surname})`;
+ }
+
+ return "";
+ };
+
+ useEffect(() => {
+ if (inputs.email) {
+ const error = validateEmailFormat(inputs.email);
+ setEmailError(error);
+
+ const email = inputs.email.toLowerCase();
+
+ // Handle pear admin accounts
+ if (email.includes("pear")) {
+ setIsStudent(false);
+ setIsTeacher(false);
+ setIsAdmin(true);
+ setCampus("admin");
+ return;
+ }
+
+ setIsAdmin(false);
+
+ // Determine campus and role for Brookhouse accounts
+ const isRunda = email.includes("runda");
+ setCampus(isRunda ? "runda" : "karen");
+
+ const isStudentEmail = email.includes("students");
+ setIsStudent(isStudentEmail);
+ setIsTeacher(!isStudentEmail);
+ }
+ }, [inputs.email]);
+
+ useEffect(() => {
+ if (inputs.username && inputs.email) {
+ const error = validateUsernameFormat(inputs.username, inputs.email);
+ setUsernameError(error);
+ }
+ }, [inputs.username, inputs.email]);
+
+
+ useEffect(() => {
+ let interval;
+ if (isOtpSent && timer > 0) {
+ interval = setInterval(() => {
+ setTimer((prev) => {
+ if (prev <= 1) {
+ setIsResendDisabled(false);
+ return 0;
+ }
+ return prev - 1;
+ });
+ }, 1000);
+ }
+ return () => clearInterval(interval);
+ }, [isOtpSent, timer]);
+
+ const formatTime = (seconds) => {
+ const mins = Math.floor(seconds / 60);
+ const secs = seconds % 60;
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
+ };
+
+ const handleResendOTP = async () => {
+ try {
+ setIsResendDisabled(true);
+ setErrorMessage("");
+
+ const response = await axios.post("/api/users/resend-otp", {
+ email: inputs.email
+ });
+
+ if (response.data.message) {
+ setTimer(180); // Reset timer to 3 minutes
+ setResendAttempts(prev => prev + 1);
+ showToast("Success", "New OTP sent successfully", "success");
+ }
+ } catch (error) {
+ const errorMsg = error.response?.data?.error || "Failed to resend OTP";
+ setErrorMessage(errorMsg);
+ showToast("Error", errorMsg, "error");
+
+ // If we got a 429 (too many attempts), keep the resend button disabled
+ if (error.response?.status !== 429) {
+ setIsResendDisabled(false);
+ }
+ }
+ };
+
+ const handleChange = (e) => {
+ setFormData({ ...formData, [e.target.name]: e.target.value });
+ };
+ const validateForm = () => {
+ if (!inputs.email || !inputs.password || !inputs.name || !inputs.username) {
+ showToast("Error", "All fields are required", "error");
+ return false;
+ }
+
+ if (emailError) {
+ showToast("Error", emailError, "error");
+ return false;
+ }
+
+ if (usernameError) {
+ showToast("Error", usernameError, "error");
+ return false;
+ }
+
+ if (!isAdmin) {
+ if (isStudent && !yearGroup) {
+ showToast("Error", "Please select your year group", "error");
+ return false;
+ }
+
+ if (isTeacher && !department) {
+ showToast("Error", "Please select your department", "error");
+ return false;
+ }
+ }
+
+ return true;
+ };
+
+ const sendOtp = async (isResend = false) => {
+ try {
+ if (!validateForm()) return;
+
+ let role = "admin";
+ if (!isAdmin) {
+ role = isStudent ? "student" : "teacher";
+ }
+
+ const signupData = {
+ name: inputs.name,
+ email: inputs.email,
+ username: inputs.username,
+ password: inputs.password,
+ role,
+ ...(campus !== "admin" ? { campus: campus.toLowerCase() } : {}),
+ ...(role === "student" ? { yearGroup } : {}),
+ ...(role === "teacher" ? { department } : {}),
+ };
+
+ if (isResend) {
+ await axios.post("/api/users/resend-otp", { email: inputs.email });
+ } else {
+ await axios.post("/api/users/signup", signupData);
+ }
+
+ setIsOtpSent(true);
+ setTimer(120);
+ setIsResendDisabled(true);
+ showToast(
+ "Success",
+ `OTP ${isResend ? "re-" : ""}sent to your email`,
+ "success"
+ );
+ } catch (error) {
+ console.error(
+ "Error sending OTP:",
+ error.response?.data || error.message
+ );
+ setErrorMessage(error.response?.data?.error || "Error sending OTP");
+ showToast(
+ "Error",
+ error.response?.data?.error || "Error sending OTP",
+ "error"
+ );
+ }
+ };
+
+ const verifyOtp = async () => {
+ try {
+ const numericOTP = parseInt(formData.otp, 10);
+ if (isNaN(numericOTP)) {
+ setErrorMessage("OTP must be a numeric value");
+ return;
+ }
+
+ const response = await axios.post("/api/users/verify-otp", {
+ email: inputs.email,
+ otp: numericOTP,
+ });
+
+ if (response.data._id) {
+ // Store user data in localStorage
+ localStorage.setItem("user-threads", JSON.stringify(response.data));
+ setUser(response.data);
+ showToast("Success", "Account created successfully!", "success");
+ } else {
+ setIsOtpVerified(true);
+ setErrorMessage("");
+ showToast("Success", "OTP verified successfully", "success");
+ }
+ } catch (error) {
+ console.error(
+ "Verify OTP error:",
+ error.response?.data?.error || error.message
+ );
+ setErrorMessage(error.response?.data?.error || "Failed to verify OTP");
+
+ if (error.response?.status === 429) {
+ setIsOtpSent(false);
+ setFormData({ otp: "" });
+ }
+ }
+ };
+
+ const handleSignup = async () => {
+ if (!isOtpVerified) {
+ setErrorMessage("Please verify your OTP before signing up");
+ return;
+ }
+
+ try {
+ const res = await fetch("/api/users/login", {
+ method: "POST",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({
+ username: inputs.username,
+ password: inputs.password,
+ }),
+ });
+
+ const data = await res.json();
+
+ if (data.error) {
+ showToast("Error", data.error, "error");
+ return;
+ }
+
+ localStorage.setItem("user-threads", JSON.stringify(data));
+ setUser(data);
+ showToast("Success", "Signup successful!", "success");
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ }
+ };
+
+ // Keep all other existing functions (validateForm, sendOtp, verifyOtp, handleSignup)
+
+ return (
+
+
+
+
+ Sign up {campus && `(${campus})`}
+
+
+
+
+ {/* Name and Username fields */}
+
+
+
+ Full name
+
+ setInputs({ ...inputs, name: e.target.value })
+ }
+ value={inputs.name}
+ />
+
+
+
+
+ Username
+
+ setInputs({ ...inputs, username: e.target.value })
+ }
+ value={inputs.username}
+ />
+ {usernameError && (
+ {usernameError}
+ )}
+
+
+
+
+ {/* Email field */}
+
+ Email address
+
+ setInputs({ ...inputs, email: e.target.value })
+ }
+ value={inputs.email}
+ placeholder={
+ isAdmin ? "example@pear.com" : "example@brookhouse.ac.ke"
+ }
+ />
+ {emailError && {emailError}}
+
+
+ {/* Password field */}
+
+ Password
+
+
+ setInputs({ ...inputs, password: e.target.value })
+ }
+ value={inputs.password}
+ />
+
+
+
+
+
+
+ {/* Role checkboxes */}
+ {!isAdmin && (
+
+
+ Student Account
+
+
+ Teacher Account
+
+
+ )}
+
+ {/* Year Group select for students */}
+ {isStudent && !isAdmin && (
+
+ Select Year Group
+
+
+ )}
+
+ {/* Department select for teachers */}
+ {isTeacher && !isAdmin && (
+
+ Select Department
+
+
+ )}
+
+ {/* Verify Email button */}
+ {!isOtpSent && (
+
+ )}
+
+ {/* OTP verification section */}
+ {isOtpSent && (
+
+ Enter OTP
+
+
+
+
+
+ {errorMessage && (
+
+ {errorMessage}
+
+ )}
+
+ )}
+
+ {/* Sign up button */}
+
+
+
+
+ {/* Login link */}
+
+
+ Already a user?{" "}
+ setAuthScreen("login")}>
+ Login
+
+
+
+
+
+
+
+ );
+};
-export default function SignupCard() {
- const [showPassword, setShowPassword] = useState(false);
- const setAuthScreen = useSetRecoilState(authScreenAtom);
- const [inputs, setInputs] = useState({
- name: "",
- username: "",
- email: "",
- password: "",
- });
-
- const showToast = useShowToast();
- const setUser = useSetRecoilState(userAtom);
-
- const handleSignup = async () => {
- try {
- const res = await fetch("/api/users/signup", {
- method: "POST",
- headers: {
- "Content-Type": "application/json",
- },
- body: JSON.stringify(inputs),
- });
- const data = await res.json();
-
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
-
- localStorage.setItem("user-threads", JSON.stringify(data));
- setUser(data);
- } catch (error) {
- showToast("Error", error, "error");
- }
- };
-
- return (
-
-
-
-
- Sign up
-
-
-
-
-
-
-
- Full name
- setInputs({ ...inputs, name: e.target.value })}
- value={inputs.name}
- />
-
-
-
-
- Username
- setInputs({ ...inputs, username: e.target.value })}
- value={inputs.username}
- />
-
-
-
-
- Email address
- setInputs({ ...inputs, email: e.target.value })}
- value={inputs.email}
- />
-
-
- Password
-
- setInputs({ ...inputs, password: e.target.value })}
- value={inputs.password}
- />
-
-
-
-
-
-
-
-
-
-
- Already a user?{" "}
- setAuthScreen("login")}>
- Login
-
-
-
-
-
-
-
- );
-}
+export default SignupCard;
diff --git a/frontend/src/components/SuggestedUser.jsx b/frontend/src/components/SuggestedUser.jsx
index 93a9bba..14097d0 100644
--- a/frontend/src/components/SuggestedUser.jsx
+++ b/frontend/src/components/SuggestedUser.jsx
@@ -1,3 +1,4 @@
+// feature disabled due to automatic folow, export function has been commented
import { Avatar, Box, Button, Flex, Text } from "@chakra-ui/react";
import { Link } from "react-router-dom";
import useFollowUnfollow from "../hooks/useFollowUnfollow";
@@ -37,7 +38,7 @@ const SuggestedUser = ({ user }) => {
);
};
-export default SuggestedUser;
+// export default SuggestedUser;
// SuggestedUser component, if u want to copy and paste as shown in the tutorial
diff --git a/frontend/src/components/SuggestedUsers.jsx b/frontend/src/components/SuggestedUsers.jsx
index f3bdfca..2f2c507 100644
--- a/frontend/src/components/SuggestedUsers.jsx
+++ b/frontend/src/components/SuggestedUsers.jsx
@@ -1,3 +1,4 @@
+// suggested users disabled due to automatic follow, export function has been commented
import { Box, Flex, Skeleton, SkeletonCircle, Text } from "@chakra-ui/react";
import { useEffect, useState } from "react";
import SuggestedUser from "./SuggestedUser";
@@ -32,7 +33,7 @@ const SuggestedUsers = () => {
return (
<>
- Suggested Users
+ students & teachers
{!loading && suggestedUsers.map((user) => )}
@@ -59,7 +60,7 @@ const SuggestedUsers = () => {
);
};
-export default SuggestedUsers;
+// export default SuggestedUsers;
// Loading skeletons for suggested users, if u want to copy and paste as shown in the tutorial
diff --git a/frontend/src/components/UserHeader.jsx b/frontend/src/components/UserHeader.jsx
index 266ad5e..d4b0153 100644
--- a/frontend/src/components/UserHeader.jsx
+++ b/frontend/src/components/UserHeader.jsx
@@ -1,127 +1,788 @@
-import { Avatar } from "@chakra-ui/avatar";
-import { Box, Flex, Link, Text, VStack } from "@chakra-ui/layout";
+// import { Avatar } from "@chakra-ui/avatar";
+// import { Box, Flex, Link, Text, VStack } from "@chakra-ui/layout";
+// import { Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/menu";
+// import { Portal } from "@chakra-ui/portal";
+// import { Button, useToast } from "@chakra-ui/react";
+// import { MdMail } from "react-icons/md";
+
+// import { CgMoreO } from "react-icons/cg";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { Link as RouterLink } from "react-router-dom";
+// import useFollowUnfollow from "../hooks/useFollowUnfollow";
+
+// const UserHeader = ({ user }) => {
+// const toast = useToast();
+// const currentUser = useRecoilValue(userAtom); // logged in user
+// const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
+
+// const copyURL = () => {
+// const currentURL = window.location.href;
+// navigator.clipboard.writeText(currentURL).then(() => {
+// toast({
+// title: "Success.",
+// status: "success",
+// description: "Profile link copied.",
+// duration: 3000,
+// isClosable: true,
+// });
+// });
+// };
+
+// return (
+//
+//
+//
+//
+// {user.name}
+//
+//
+// {user.username}
+//
+// brookhouse
+//
+//
+//
+//
+// {user.profilePic && (
+//
+// )}
+// {!user.profilePic && (
+//
+// )}
+//
+//
+
+// {user.bio}
+
+// {currentUser?._id === user._id && (
+//
+//
+//
+// )}
+// {currentUser?._id !== user._id && (
+//
+// )}
+//
+//
+// {/* {user.followers.length} followers */}
+// Pear
+//
+// gmail.com
+//
+//
+// {/* okay this is for the icon and making it more functional
+// want to add an email icon that can link us to the users mail */}
+//
+//
+//
+//
+//
+//
+//
+//
+
+//
+//
+// Feed
+//
+// {/*
+// Replies
+// */}
+
+//
+//
+// );
+// };
+
+// export default UserHeader;
+
+
+
+// so thi sis a working version without translations added
+// import { Avatar } from "@chakra-ui/avatar";
+// import { Box, Flex, Link, Text, VStack } from "@chakra-ui/layout";
+// import { Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/menu";
+// import { Portal } from "@chakra-ui/portal";
+// import { Button, useToast } from "@chakra-ui/react";
+// import { MdVideoCall } from "react-icons/md"; // Import the video icon
+// import { CgMoreO } from "react-icons/cg";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { Link as RouterLink } from "react-router-dom";
+// import useFollowUnfollow from "../hooks/useFollowUnfollow";
+
+// const UserHeader = ({ user }) => {
+// const toast = useToast();
+// const currentUser = useRecoilValue(userAtom); // logged in user
+// const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
+
+// const copyURL = () => {
+// const currentURL = window.location.href;
+// navigator.clipboard.writeText(currentURL).then(() => {
+// toast({
+// title: "Success.",
+// status: "success",
+// description: "Profile link copied.",
+// duration: 3000,
+// isClosable: true,
+// });
+// });
+// };
+
+// return (
+//
+//
+//
+//
+// {user.name}
+//
+//
+// {user.username}
+//
+// brookhouse
+//
+//
+//
+//
+// {user.profilePic && (
+//
+// )}
+// {!user.profilePic && (
+//
+// )}
+//
+//
+
+// {user.bio}
+
+// {currentUser?._id === user._id && (
+//
+//
+//
+// )}
+// {currentUser?._id !== user._id && (
+//
+// )}
+//
+//
+// Pear
+//
+//
+// meet.com
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+//
+//
+// Feed
+//
+//
+//
+// );
+// };
+
+// export default UserHeader;
+
+
+// this is an updated version with translations working
+// import { Avatar } from "@chakra-ui/avatar";
+// import { Box, Flex, Link, Text, VStack } from "@chakra-ui/layout";
+// import { Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/menu";
+// import { Portal } from "@chakra-ui/portal";
+// import { Button, useToast } from "@chakra-ui/react";
+// import { MdVideoCall } from "react-icons/md";
+// import { CgMoreO } from "react-icons/cg";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { Link as RouterLink } from "react-router-dom";
+// import useFollowUnfollow from "../hooks/useFollowUnfollow";
+// import { useTranslation } from 'react-i18next'; // Import useTranslation
+// import React, { useEffect, useState } from 'react'; // Import useState and useEffect
+
+// const UserHeader = ({ user }) => {
+// const toast = useToast();
+// const currentUser = useRecoilValue(userAtom); // logged in user
+// const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
+// const { t, i18n } = useTranslation(); // Initialize the translation hook
+// const [language, setLanguage] = useState(i18n.language); // Add a state for language
+
+// useEffect(() => {
+// // Update the language state whenever the i18n language changes
+// const handleLanguageChange = (lng) => {
+// setLanguage(lng);
+// };
+
+// i18n.on('languageChanged', handleLanguageChange);
+
+// return () => {
+// i18n.off('languageChanged', handleLanguageChange);
+// };
+// }, [i18n]);
+
+// const copyURL = () => {
+// const currentURL = window.location.href;
+// navigator.clipboard.writeText(currentURL).then(() => {
+// toast({
+// title: t("Success."), // Use t() for translations
+// status: "success",
+// description: t("Profile link copied."), // Use t() for translations
+// duration: 3000,
+// isClosable: true,
+// });
+// });
+// };
+
+// return (
+//
+//
+//
+//
+// {user.name}
+//
+//
+// {user.username}
+//
+// brookhouse
+//
+//
+//
+//
+// {user.profilePic && (
+//
+// )}
+// {!user.profilePic && (
+//
+// )}
+//
+//
+
+// {user.bio}
+
+// {currentUser?._id === user._id && (
+//
+// {/* Use t() */}
+//
+// )}
+// {currentUser?._id !== user._id && (
+//
+// )}
+//
+//
+// Pear
+//
+//
+// meet.com
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+//
+//
+// {t("Feed")} {/* Use t() */}
+//
+//
+//
+// );
+// };
+
+// export default UserHeader;
+
+
+// with updated profile this is working version
+// import { Avatar, Box, Flex, Link, Text, VStack, useToast } from "@chakra-ui/react";
+// import { Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/menu";
+// import { Portal } from "@chakra-ui/portal";
+// import { Button } from "@chakra-ui/react";
+// import { MdVideoCall } from "react-icons/md";
+// import { CgMoreO } from "react-icons/cg";
+// import { useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { Link as RouterLink, useNavigate } from "react-router-dom";
+// import useFollowUnfollow from "../hooks/useFollowUnfollow";
+// import { useTranslation } from 'react-i18next';
+// import React, { useEffect, useState } from 'react';
+// import { motion } from 'framer-motion';
+
+// const MotionAvatar = motion(Avatar);
+
+// const UserHeader = ({ user }) => {
+// const toast = useToast();
+// const currentUser = useRecoilValue(userAtom); // logged in user
+// const navigate = useNavigate(); // For navigation
+// const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
+// const { t, i18n } = useTranslation();
+// const [language, setLanguage] = useState(i18n.language);
+
+// useEffect(() => {
+// const handleLanguageChange = (lng) => {
+// setLanguage(lng);
+// };
+
+// i18n.on('languageChanged', handleLanguageChange);
+
+// return () => {
+// i18n.off('languageChanged', handleLanguageChange);
+// };
+// }, [i18n]);
+
+// const copyURL = () => {
+// const currentURL = window.location.href;
+// navigator.clipboard.writeText(currentURL).then(() => {
+// toast({
+// title: t("Success."),
+// status: "success",
+// description: t("Profile link copied."),
+// duration: 3000,
+// isClosable: true,
+// });
+// });
+// };
+
+// const handleProfileClick = () => {
+// navigate('/update'); // Redirect to UpdateProfilePage
+// };
+
+// return (
+//
+//
+//
+//
+// {user.name}
+//
+//
+// {user.username}
+//
+// brookhouse
+//
+//
+//
+//
+// {user.profilePic && (
+//
+// )}
+// {!user.profilePic && (
+//
+// )}
+//
+//
+
+// {user.bio}
+
+// {currentUser?._id === user._id && (
+//
+//
+//
+// )}
+// {currentUser?._id !== user._id && (
+//
+// )}
+//
+//
+// Pear
+//
+//
+// meet.com
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+
+//
+//
+// {t("Feed")}
+//
+//
+//
+// );
+// };
+
+// export default UserHeader;
+
+
+// this updated version with verification(working)
+import { Avatar, Box, Flex, Link, Text, VStack, useToast, IconButton } from "@chakra-ui/react";
import { Menu, MenuButton, MenuItem, MenuList } from "@chakra-ui/menu";
import { Portal } from "@chakra-ui/portal";
-import { Button, useToast } from "@chakra-ui/react";
-import { BsInstagram } from "react-icons/bs";
+import { Button } from "@chakra-ui/react";
+import { MdVideoCall } from "react-icons/md";
import { CgMoreO } from "react-icons/cg";
import { useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
-import { Link as RouterLink } from "react-router-dom";
+import { Link as RouterLink, useNavigate } from "react-router-dom";
import useFollowUnfollow from "../hooks/useFollowUnfollow";
+import { useTranslation } from 'react-i18next';
+import React, { useEffect, useState } from 'react';
+import { motion } from 'framer-motion';
+import { useDisclosure } from "@chakra-ui/hooks";
+
+const MotionAvatar = motion(Avatar);
const UserHeader = ({ user }) => {
- const toast = useToast();
- const currentUser = useRecoilValue(userAtom); // logged in user
- const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
-
- const copyURL = () => {
- const currentURL = window.location.href;
- navigator.clipboard.writeText(currentURL).then(() => {
- toast({
- title: "Success.",
- status: "success",
- description: "Profile link copied.",
- duration: 3000,
- isClosable: true,
- });
- });
- };
-
- return (
-
-
-
-
- {user.name}
-
-
- {user.username}
-
- threads.net
-
-
-
-
- {user.profilePic && (
-
- )}
- {!user.profilePic && (
-
- )}
-
-
-
- {user.bio}
-
- {currentUser?._id === user._id && (
-
-
-
- )}
- {currentUser?._id !== user._id && (
-
- )}
-
-
- {user.followers.length} followers
-
- instagram.com
-
-
-
-
-
-
-
-
-
-
-
-
-
- Threads
-
-
- Replies
-
-
-
- );
+ const toast = useToast();
+ const currentUser = useRecoilValue(userAtom);
+ const navigate = useNavigate();
+ const { handleFollowUnfollow, following, updating } = useFollowUnfollow(user);
+ const { t, i18n } = useTranslation();
+ const [language, setLanguage] = useState(i18n.language);
+ const [isDropdownOpen, setIsDropdownOpen] = useState(false);
+
+ useEffect(() => {
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on('languageChanged', handleLanguageChange);
+ return () => i18n.off('languageChanged', handleLanguageChange);
+ }, [i18n]);
+
+ const showToast = (title, description, status) => {
+ toast({ title, description, status, duration: 3000, isClosable: true });
+ };
+
+ const copyURL = () => {
+ navigator.clipboard.writeText(window.location.href).then(() => {
+ showToast(t("Success."), t("Profile link copied."), "success");
+ });
+ };
+
+ const handleAdminAction = async (action) => {
+ try {
+ const res = await fetch(`/api/users/admin/${action}-user`, {
+ method: action === 'delete' ? 'DELETE' : 'POST',
+ headers: { 'Content-Type': 'application/json' },
+ body: JSON.stringify({ userId: user._id })
+ });
+ const data = await res.json();
+ if (data.error) return showToast("Error", data.error, "error");
+ showToast("Success", `User ${action === 'delete' ? 'deleted' : 'frozen'} successfully`, "success");
+ } catch (error) {
+ showToast("Error", error.message, "error");
+ }
+ };
+
+ return (
+
+
+
+ {user.name}
+
+ {user.username}
+ {user.verification && (
+
+ {user.verification === 'gold' ? "Gold Verified" : "Blue Verified"}
+
+ )}
+
+
+
+ currentUser?.role === 'admin' && setIsDropdownOpen(!isDropdownOpen)}
+ cursor={currentUser?.role === 'admin' ? "pointer" : "default"}
+ whileHover={{ scale: 1.05 }}
+ transition={{ duration: 0.2 }}
+ />
+
+ {isDropdownOpen && currentUser?.role === 'admin' && (
+
+
+ ❄️ Freeze Account}
+ onClick={() => handleAdminAction('freeze')}
+ _hover={{ bg: 'blue.800' }}
+ />
+ 🗑️ Delete Account}
+ onClick={() => handleAdminAction('delete')}
+ _hover={{ bg: 'red.800' }}
+ />
+
+
+ )}
+
+
+
+ {user.bio}
+
+ {currentUser?._id === user._id ? (
+
+
+
+ ) : (
+
+ )}
+
+ {/* Maintained original design elements */}
+
+
+ Pear
+
+
+ meet.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t("Feed")}
+
+
+
+ );
};
-export default UserHeader;
+export default UserHeader;
\ No newline at end of file
diff --git a/frontend/src/components/UserPost.jsx b/frontend/src/components/UserPost.jsx
index c7107de..a02921a 100644
--- a/frontend/src/components/UserPost.jsx
+++ b/frontend/src/components/UserPost.jsx
@@ -1,89 +1,200 @@
+// version 1 working
+// import { Avatar } from "@chakra-ui/avatar";
+// import { Image } from "@chakra-ui/image";
+// import { Box, Flex, Text } from "@chakra-ui/layout";
+// import { BsThreeDots } from "react-icons/bs";
+// import { Link } from "react-router-dom";
+// import Actions from "./Actions";
+// import { useState } from "react";
+
+// const UserPost = ({ postImg, postTitle, likes, replies }) => {
+// const [liked, setLiked] = useState(false);
+// return (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// markzuckerberg
+//
+//
+//
+//
+//
+// 1d
+//
+//
+//
+//
+
+// {postTitle}
+// {postImg && (
+//
+//
+//
+// )}
+
+//
+//
+//
+
+//
+//
+// {replies} replies
+//
+//
+//
+// {likes} likes
+//
+//
+//
+//
+//
+// );
+// };
+
+// export default UserPost;
+
+
+// version 2 with translations
import { Avatar } from "@chakra-ui/avatar";
import { Image } from "@chakra-ui/image";
import { Box, Flex, Text } from "@chakra-ui/layout";
import { BsThreeDots } from "react-icons/bs";
import { Link } from "react-router-dom";
import Actions from "./Actions";
-import { useState } from "react";
+import { useState, useEffect } from "react";
+import { useTranslation } from 'react-i18next'; // Import the useTranslation hook
const UserPost = ({ postImg, postTitle, likes, replies }) => {
- const [liked, setLiked] = useState(false);
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- markzuckerberg
-
-
-
-
-
- 1d
-
-
-
-
-
- {postTitle}
- {postImg && (
-
-
-
- )}
-
-
-
-
-
-
-
- {replies} replies
-
-
-
- {likes} likes
-
-
-
-
-
- );
+ const [liked, setLiked] = useState(false);
+ const { t, i18n } = useTranslation(); // Initialize the translation hook
+
+ useEffect(() => {
+ // Update the language state whenever the i18n language changes
+ const handleLanguageChange = (lng) => {
+ // This will force the component to re-render when the language changes
+ setLiked(liked => !liked); // A simple state update to trigger re-render
+ };
+
+ i18n.on('languageChanged', handleLanguageChange); // Listen for language change
+
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange); // Cleanup on component unmount
+ };
+ }, [i18n]);
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {t('markzuckerberg')} {/* Wrap in t() for translation */}
+
+
+
+
+
+ {t('1d')} {/* Wrap in t() for translation */}
+
+
+
+
+
+ {t(postTitle)} {/* Wrap postTitle in t() */}
+
+ {postImg && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ {t('{{count}} replies', { count: replies })} {/* Translation for replies */}
+
+
+
+ {t('{{count}} likes', { count: likes })} {/* Translation for likes */}
+
+
+
+
+
+ );
};
export default UserPost;
diff --git a/frontend/src/context/SocketContext.jsx b/frontend/src/context/SocketContext.jsx
index d4bc973..761ae04 100644
--- a/frontend/src/context/SocketContext.jsx
+++ b/frontend/src/context/SocketContext.jsx
@@ -15,7 +15,7 @@ export const SocketContextProvider = ({ children }) => {
const user = useRecoilValue(userAtom);
useEffect(() => {
- const socket = io("/", {
+ const socket = io("https://pear-tsk2.onrender.com/", {
query: {
userId: user?._id,
},
diff --git a/frontend/src/i18n.js b/frontend/src/i18n.js
new file mode 100644
index 0000000..e1b14d5
--- /dev/null
+++ b/frontend/src/i18n.js
@@ -0,0 +1,316 @@
+
+// versioon one only works for the settigns page
+// // src/i18n.js
+
+// import i18n from 'i18next';
+// import { initReactI18next } from 'react-i18next';
+
+// // Define your translations
+// const resources = {
+// en: {
+// translation: {
+// "Welcome": "Welcome",
+// "Freeze Your Account": "Freeze Your Account",
+// "You can unfreeze your account anytime by logging in.": "You can unfreeze your account anytime by logging in.",
+// "Freeze": "Freeze"
+// // Add more translations here
+// }
+// },
+// zh: {
+// translation: {
+// "Welcome": "欢迎",
+// "Freeze Your Account": "冻结您的帐户",
+// "You can unfreeze your account anytime by logging in.": "您可以随时通过登录解冻帐户。",
+// "Freeze": "冻结"
+// // Add more translations here
+// }
+// }
+// };
+
+// i18n
+// .use(initReactI18next)
+// .init({
+// resources,
+// lng: "en", // Default language
+// interpolation: {
+// escapeValue: false
+// }
+// });
+
+// export default i18n;
+
+
+// version two trail
+import i18n from 'i18next';
+import { initReactI18next } from 'react-i18next';
+
+// Define your translations
+const resources = {
+ en: {
+ translation: {
+ // User Header Component
+ "Welcome": "Welcome",
+ "Freeze Your Account": "Freeze Your Account",
+ "You can unfreeze your account anytime by logging in.": "You can unfreeze your account anytime by logging in.",
+ "Freeze": "Freeze",
+ "Edit Profile": "Edit Profile",
+ "Unfollow": "Unfollow",
+ "Follow": "Follow",
+ "Copy link": "Copy link",
+ "Profile link copied.": "Profile link copied.",
+ "Feed": "Feed",
+ "Pear": "Pear",
+ "meet.com": "meet.com",
+
+ // Post Component
+ "Delete Post": "Delete Post", // Confirmation for deleting post
+ "Are you sure you want to delete this post?": "Are you sure you want to delete this post?", // Delete confirmation prompt
+ "Post deleted": "Post deleted", // Toast message for successful deletion
+ "Error deleting post": "Error deleting post", // Error message
+ "ago": "ago", // Used for time formatting
+
+ // UserPost Component Translations
+ "replies": "replies",
+ "likes": "likes",
+ "1d": "1d", // Keep the time format consistent
+ "markzuckerberg": "Mark Zuckerberg",
+ "Post Title Placeholder": "This is a post title placeholder",
+
+ // Actions Component Translations
+ "Like": "Like",
+ "Comment": "Comment",
+ "Repost": "Repost",
+ "Share": "Share",
+ "Error": "Error",
+ "Success": "Success",
+ "You must be logged in to like a post": "You must be logged in to like a post",
+ "You must be logged in to reply to a post": "You must be logged in to reply to a post",
+ "Reply": "Reply",
+ "Reply posted successfully": "Reply posted successfully",
+ "Reply goes here...": "Reply goes here...",
+
+ // create post translations
+ "Create Post": "Create Post",
+ "Post content goes here..": "Post content goes here..",
+ "Post": "Post",
+ "Post created successfully": "Post created successfully",
+ "Error": "Error",
+ "Error creating post": "Error creating post",
+
+ // message translations
+ "Error": "Error",
+ "Are you sure you want to delete this post?": "Are you sure you want to delete this post?",
+ "Error deleting post": "Error deleting post",
+ "Success": "Success",
+ "Post deleted": "Post deleted",
+ "ago": "ago",
+ "Message contains inappropriate content and was not sent.": "Message contains inappropriate content and was not sent.",
+ "Delete message": "Delete message",
+ "Message image": "Message image",
+
+ // chat page translations
+ "Your Conversations": "Your Conversations",
+ "Search for a user": "Search for a user",
+ "Error": "Error",
+ "You cannot message yourself": "You cannot message yourself",
+ "Select a conversation to start messaging": "Select a conversation to start messaging",
+ "ago": "ago",
+ "Error deleting post": "Error deleting post",
+ "Are you sure you want to delete this post?": "Are you sure you want to delete this post?",
+ "Success": "Success",
+ "Post deleted": "Post deleted",
+
+ // post page component
+ "Error": "Error",
+ "Success": "Success",
+ "Post deleted": "Post deleted",
+ "Are you sure you want to delete this post?": "Are you sure you want to delete this post?",
+ "Error deleting post": "Error deleting post",
+ "ago": "ago",
+ "The application is coming to your phone soon.": "The application is coming to your phone soon.",
+ "Loading": "Loading...",
+ "Delete post confirmation": "Are you sure you want to delete this post?",
+ "No post found": "No post found.",
+ "Unable to load post": "Unable to load post.",
+ "Replies": "Replies",
+ "Post": "Post",
+ "Like": "Like",
+ "Unlike": "Unlike",
+ "Comment": "Comment",
+ "Share": "Share",
+ // trnalstions for home page
+ "Error": "Error",
+ "New to you!": "New to you!",
+ "Welcome to Pear! You have successfully created an account. Log in to see the latest Brookhouse news.": "Welcome to Pear! You have successfully created an account. Log in to see the latest Brookhouse news.",
+ // translations for the update profile page
+ "User Profile Edit": "Edit Profile",
+ "Change Avatar": "Change Avatar",
+ "Full name": "Full name",
+ "John Doe": "John Doe",
+ "User name": "Username",
+ "johndoe": "johndoe",
+ "Email address": "Email address",
+ "your-email@example.com": "your-email@example.com",
+ "Bio": "Bio",
+ "Your bio.": "Your bio.",
+ "Password": "Password",
+ "password": "password",
+ "Cancel": "Cancel",
+ "Submit": "Submit",
+ "Profile updated successfully": "Profile updated successfully",
+ "Error updating profile": "Error updating profile",
+ "steep": "steep",
+ // translations for create post
+ "Add Reply": "Add Reply",
+ "Add Image": "Add Image",
+ // Settings Page Translations
+ "Email Notifications": "Email Notifications",
+ "enabled": "enabled",
+ "disabled": "disabled",
+ "Receive email notifications for new posts": "Receive email notifications for new posts",
+ "Email notifications are disabled": "Email notifications are disabled",
+ "Are you sure you want to freeze your account?": "Are you sure you want to freeze your account?",
+ "Your account has been frozen": "Your account has been frozen",
+
+ }
+ },
+ zh: {
+ translation: {
+ // User Header Component
+ "Welcome": "欢迎",
+ "Freeze Your Account": "冻结您的帐户",
+ "You can unfreeze your account anytime by logging in.": "您可以随时通过登录解冻帐户。",
+ "Freeze": "冻结",
+ "Edit Profile": "编辑资料",
+ "Unfollow": "取消关注",
+ "Follow": "关注",
+ "Copy link": "复制链接",
+ "Profile link copied.": "资料链接已复制。",
+ "Feed": "动态",
+ "Pear": "梨",
+ "meet.com": "meet.com",
+
+ // Post Component
+ "Delete Post": "删除帖子", // Confirmation for deleting post
+ "Are you sure you want to delete this post?": "您确定要删除此帖子吗?", // Delete confirmation prompt
+ "Post deleted": "帖子已删除", // Toast message for successful deletion
+ "Error deleting post": "删除帖子时出错", // Error message
+ "ago": "前", // Used for time formatting
+ // UserPost Component Translations
+ "replies": "回复",
+ "likes": "点赞",
+ "1d": "1天前",
+ "markzuckerberg": "马克·扎克伯格",
+ "Post Title Placeholder": "这是一个帖子标题占位符",
+
+ // Actions Component Translations
+ "Like": "点赞",
+ "Comment": "评论",
+ "Repost": "转发",
+ "Share": "分享",
+ "Error": "错误",
+ "Success": "成功",
+ "You must be logged in to like a post": "您必须登录才能点赞",
+ "You must be logged in to reply to a post": "您必须登录才能回复帖子",
+ "Reply": "回复",
+ "Reply posted successfully": "回复发布成功",
+ "Reply goes here...": "请输入回复内容...",
+
+ // create post component
+ "Create Post": "创建帖子",
+ "Post content goes here..": "帖子内容在这里...",
+ "Post": "发布",
+ "Post created successfully": "帖子成功发布",
+ "Error": "错误",
+ "Error creating post": "创建帖子时出错",
+
+ // message translations
+ "Error": "错误",
+ "Are you sure you want to delete this post?": "你确定要删除这篇帖子吗?",
+ "Error deleting post": "删除帖子时出错",
+ "Success": "成功",
+ "Post deleted": "帖子已删除",
+ "ago": "之前",
+ "Message contains inappropriate content and was not sent.": "消息包含不适当内容,未发送。",
+ "Delete message": "删除消息",
+ "Message image": "消息图片",
+
+ // chatpage translations
+ "Your Conversations": "您的对话",
+ "Search for a user": "搜索用户",
+ "Error": "错误",
+ "You cannot message yourself": "您不能给自己发消息",
+ "Select a conversation to start messaging": "选择一个对话开始消息",
+ "ago": "前",
+ "Error deleting post": "删除帖子时出错",
+ "Are you sure you want to delete this post?": "您确定要删除此帖子吗?",
+ "Success": "成功",
+ "Post deleted": "帖子已删除",
+
+ // post page component
+ "Error": "错误",
+ "Success": "成功",
+ "Post deleted": "帖子已删除",
+ "Are you sure you want to delete this post?": "您确定要删除此帖子吗?",
+ "Error deleting post": "删除帖子时出错",
+ "ago": "前",
+ "The application is coming to your phone soon.": "应用程序即将登陆您的手机。",
+ "Loading": "加载中...",
+ "Delete post confirmation": "您确定要删除此帖子吗?",
+ "No post found": "未找到帖子。",
+ "Unable to load post": "无法加载帖子。",
+ "Replies": "回复",
+ "Post": "帖子",
+ "Like": "赞",
+ "Unlike": "取消赞",
+ "Comment": "评论",
+ "Share": "分享",
+ // transaltions for the home page
+ "Error": "错误",
+ "New to you!": "新消息!",
+ "Welcome to Pear! You have successfully created an account. Log in to see the latest Brookhouse news.": "欢迎使用 Pear!您已成功创建账户。登录以查看最新的 Brookhouse 新闻。",
+ // trnalstions for the update profile page
+ "User Profile Edit": "编辑个人资料",
+ "Change Avatar": "更改头像",
+ "Full name": "全名",
+ "John Doe": "约翰·多伊",
+ "User name": "用户名",
+ "johndoe": "约翰多伊",
+ "Email address": "电子邮件地址",
+ "your-email@example.com": "你的邮箱@example.com",
+ "Bio": "简介",
+ "Your bio.": "您的简介。",
+ "Password": "密码",
+ "password": "密码",
+ "Cancel": "取消",
+ "Submit": "提交",
+ "Profile updated successfully": "个人资料更新成功",
+ "Error updating profile": "更新个人资料时出错",
+ // this is adding create post tranalsitons
+ "Add Reply": "添加回复",
+ "Add Image": "添加图片",
+ // Settings Page Translations
+ "Email Notifications": "电子邮件通知",
+ "enabled": "已启用",
+ "disabled": "已禁用",
+ "Receive email notifications for new posts": "接收新帖子的电子邮件通知",
+ "Email notifications are disabled": "电子邮件通知已禁用",
+ "Are you sure you want to freeze your account?": "您确定要冻结您的帐户吗?",
+ "Your account has been frozen": "您的帐户已被冻结",
+ }
+ }
+};
+
+i18n
+ .use(initReactI18next)
+ .init({
+ resources,
+ lng: "en", // Default language
+ fallbackLng: "en", // Fallback language
+ interpolation: {
+ escapeValue: false
+ },
+ debug: true // Enable debug mode
+ });
+
+export default i18n;
diff --git a/frontend/src/index.css b/frontend/src/index.css
index 2632bbe..ae7a794 100644
--- a/frontend/src/index.css
+++ b/frontend/src/index.css
@@ -1,3 +1,4 @@
+/* Icon container hover effect */
.icon-container {
border-radius: 50%;
padding: 8px;
@@ -10,6 +11,7 @@
background-color: #1e1e1e;
}
+/* Scrollbar styling */
::-webkit-scrollbar {
width: 7px;
}
@@ -21,6 +23,58 @@
::-webkit-scrollbar-thumb {
background-color: #888;
}
-::-webkit-scrollbar-thumb {
+
+::-webkit-scrollbar-thumb:hover {
background-color: #555;
}
+
+/* Popout and rotation hover effect for posts */
+@keyframes subtleColorChange {
+ 0% {
+ background-color: #ffffff; /* Light mode */
+ }
+ 100% {
+ background-color: #E6F7EB; /* Subtle green shade */
+ }
+}
+
+/* Hover effect for the post container */
+.postContainer {
+ transition: all 0.3s ease-in-out;
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.1); /* Initial shadow */
+ transform: rotate(0deg); /* Ensure initial rotation is 0 */
+}
+
+.postContainer:hover {
+ transform: scale(1.05) rotate(3deg); /* Slight popout and rotation on hover */
+ box-shadow: 0px 4px 12px rgba(0, 0, 0, 0.15); /* Figma-inspired shadow on hover */
+ animation: subtleColorChange 0.5s ease-in-out forwards;
+}
+
+/* New to You text color change effect */
+@keyframes pulseEffect {
+ 0% {
+ color: #FF6F61; /* Orangish-red for the 'N' */
+ }
+ 20% {
+ color: #FF7043; /* Slightly lighter orangish-red */
+ }
+ 40% {
+ color: #FF8A65;
+ }
+ 60% {
+ color: #FFAB91;
+ }
+ 80% {
+ color: #FF7043;
+ }
+ 100% {
+ color: #FF6F61; /* Back to the original color */
+ }
+}
+
+.newToYouText {
+ display: inline-block;
+ animation: pulseEffect 2s ease-in-out infinite;
+ text-shadow: 0 0 5px rgba(255, 112, 67, 0.2), 0 0 10px rgba(255, 112, 67, 0.1); /* Subtle glow */
+}
diff --git a/frontend/src/pages/ChatPage.jsx b/frontend/src/pages/ChatPage.jsx
index 184efca..39c05bc 100644
--- a/frontend/src/pages/ChatPage.jsx
+++ b/frontend/src/pages/ChatPage.jsx
@@ -1,3 +1,634 @@
+// working version
+// import { SearchIcon } from "@chakra-ui/icons";
+// import { Box, Button, Flex, Input, Skeleton, SkeletonCircle, Text, useColorModeValue } from "@chakra-ui/react";
+// import Conversation from "../components/Conversation";
+// import { GiConversation } from "react-icons/gi";
+// import MessageContainer from "../components/MessageContainer";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import { conversationsAtom, selectedConversationAtom } from "../atoms/messagesAtom";
+// import userAtom from "../atoms/userAtom";
+// import { useSocket } from "../context/SocketContext";
+
+// const ChatPage = () => {
+// const [searchingUser, setSearchingUser] = useState(false);
+// const [loadingConversations, setLoadingConversations] = useState(true);
+// const [searchText, setSearchText] = useState("");
+// const [selectedConversation, setSelectedConversation] = useRecoilState(selectedConversationAtom);
+// const [conversations, setConversations] = useRecoilState(conversationsAtom);
+// const currentUser = useRecoilValue(userAtom);
+// const showToast = useShowToast();
+// const { socket, onlineUsers } = useSocket();
+
+// useEffect(() => {
+// socket?.on("messagesSeen", ({ conversationId }) => {
+// setConversations((prev) => {
+// const updatedConversations = prev.map((conversation) => {
+// if (conversation._id === conversationId) {
+// return {
+// ...conversation,
+// lastMessage: {
+// ...conversation.lastMessage,
+// seen: true,
+// },
+// };
+// }
+// return conversation;
+// });
+// return updatedConversations;
+// });
+// });
+// }, [socket, setConversations]);
+
+// useEffect(() => {
+// const getConversations = async () => {
+// try {
+// const res = await fetch("/api/messages/conversations");
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// console.log(data);
+// setConversations(data);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setLoadingConversations(false);
+// }
+// };
+
+// getConversations();
+// }, [showToast, setConversations]);
+
+// const handleConversationSearch = async (e) => {
+// e.preventDefault();
+// setSearchingUser(true);
+// try {
+// const res = await fetch(`/api/users/profile/${searchText}`);
+// const searchedUser = await res.json();
+// if (searchedUser.error) {
+// showToast("Error", searchedUser.error, "error");
+// return;
+// }
+
+// const messagingYourself = searchedUser._id === currentUser._id;
+// if (messagingYourself) {
+// showToast("Error", "You cannot message yourself", "error");
+// return;
+// }
+
+// const conversationAlreadyExists = conversations.find(
+// (conversation) => conversation.participants[0]._id === searchedUser._id
+// );
+
+// if (conversationAlreadyExists) {
+// setSelectedConversation({
+// _id: conversationAlreadyExists._id,
+// userId: searchedUser._id,
+// username: searchedUser.username,
+// userProfilePic: searchedUser.profilePic,
+// });
+// return;
+// }
+
+// const mockConversation = {
+// mock: true,
+// lastMessage: {
+// text: "",
+// sender: "",
+// },
+// _id: Date.now(),
+// participants: [
+// {
+// _id: searchedUser._id,
+// username: searchedUser.username,
+// profilePic: searchedUser.profilePic,
+// },
+// ],
+// };
+// setConversations((prevConvs) => [...prevConvs, mockConversation]);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setSearchingUser(false);
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// Your Conversations
+//
+//
+
+// {loadingConversations &&
+// [0, 1, 2, 3, 4].map((_, i) => (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// ))}
+
+// {!loadingConversations &&
+// conversations.map((conversation) => (
+//
+// ))}
+//
+// {!selectedConversation._id && (
+//
+//
+// Select a conversation to start messaging
+//
+// )}
+
+// {selectedConversation._id && }
+//
+//
+// );
+// };
+
+// export default ChatPage;
+
+
+// version two with transaltions not working for some reason
+// import { SearchIcon } from "@chakra-ui/icons";
+// import { Box, Button, Flex, Input, Skeleton, SkeletonCircle, Text, useColorModeValue } from "@chakra-ui/react";
+// import Conversation from "../components/Conversation";
+// import { GiConversation } from "react-icons/gi";
+// import MessageContainer from "../components/MessageContainer";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import { conversationsAtom, selectedConversationAtom } from "../atoms/messagesAtom";
+// import userAtom from "../atoms/userAtom";
+// import { useSocket } from "../context/SocketContext";
+// import { useTranslation } from 'react-i18next'; // Import useTranslation
+
+// const ChatPage = () => {
+// const [searchingUser, setSearchingUser] = useState(false);
+// const [loadingConversations, setLoadingConversations] = useState(true);
+// const [searchText, setSearchText] = useState("");
+// const [selectedConversation, setSelectedConversation] = useRecoilState(selectedConversationAtom);
+// const [conversations, setConversations] = useRecoilState(conversationsAtom);
+// const currentUser = useRecoilValue(userAtom);
+// const showToast = useShowToast();
+// const { socket, onlineUsers } = useSocket();
+// const { t, i18n } = useTranslation(); // Initialize the translation hook
+// const [language, setLanguage] = useState(i18n.language); // Track current language
+
+// // Handle language changes and update the UI accordingly
+// useEffect(() => {
+// const handleLanguageChange = (lng) => {
+// setLanguage(lng);
+// };
+
+// i18n.on('languageChanged', handleLanguageChange); // Listen for language change
+
+// return () => {
+// i18n.off('languageChanged', handleLanguageChange); // Cleanup on unmount
+// };
+// }, [i18n]);
+
+// useEffect(() => {
+// socket?.on("messagesSeen", ({ conversationId }) => {
+// setConversations((prev) => {
+// const updatedConversations = prev.map((conversation) => {
+// if (conversation._id === conversationId) {
+// return {
+// ...conversation,
+// lastMessage: {
+// ...conversation.lastMessage,
+// seen: true,
+// },
+// };
+// }
+// return conversation;
+// });
+// return updatedConversations;
+// });
+// });
+// }, [socket, setConversations]);
+
+// useEffect(() => {
+// const getConversations = async () => {
+// try {
+// const res = await fetch("/api/messages/conversations");
+// const data = await res.json();
+// if (data.error) {
+// showToast(t("Error"), data.error, "error");
+// return;
+// }
+// setConversations(data);
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setLoadingConversations(false);
+// }
+// };
+
+// getConversations();
+// }, [showToast, setConversations, t]);
+
+// const handleConversationSearch = async (e) => {
+// e.preventDefault();
+// setSearchingUser(true);
+// try {
+// const res = await fetch(`/api/users/profile/${searchText}`);
+// const searchedUser = await res.json();
+// if (searchedUser.error) {
+// showToast(t("Error"), searchedUser.error, "error");
+// return;
+// }
+
+// const messagingYourself = searchedUser._id === currentUser._id;
+// if (messagingYourself) {
+// showToast(t("Error"), t("You cannot message yourself"), "error");
+// return;
+// }
+
+// const conversationAlreadyExists = conversations.find(
+// (conversation) => conversation.participants[0]._id === searchedUser._id
+// );
+
+// if (conversationAlreadyExists) {
+// setSelectedConversation({
+// _id: conversationAlreadyExists._id,
+// userId: searchedUser._id,
+// username: searchedUser.username,
+// userProfilePic: searchedUser.profilePic,
+// });
+// return;
+// }
+
+// const mockConversation = {
+// mock: true,
+// lastMessage: {
+// text: "",
+// sender: "",
+// },
+// _id: Date.now(),
+// participants: [
+// {
+// _id: searchedUser._id,
+// username: searchedUser.username,
+// profilePic: searchedUser.profilePic,
+// },
+// ],
+// };
+// setConversations((prevConvs) => [...prevConvs, mockConversation]);
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setSearchingUser(false);
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// {t("Your Conversations")}
+//
+//
+
+// {loadingConversations &&
+// [0, 1, 2, 3, 4].map((_, i) => (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// ))}
+
+// {!loadingConversations &&
+// conversations.map((conversation) => (
+//
+// ))}
+//
+// {!selectedConversation._id && (
+//
+//
+// {t("Select a conversation to start messaging")}
+//
+// )}
+
+// {selectedConversation._id && }
+//
+//
+// );
+// };
+
+// export default ChatPage;
+
+
+
+// debugging nad fixes that version
+// import { SearchIcon } from "@chakra-ui/icons";
+// import { Box, Button, Flex, Input, Skeleton, SkeletonCircle, Text, useColorModeValue } from "@chakra-ui/react";
+// import Conversation from "../components/Conversation";
+// import { GiConversation } from "react-icons/gi";
+// import MessageContainer from "../components/MessageContainer";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import { conversationsAtom, selectedConversationAtom } from "../atoms/messagesAtom";
+// import userAtom from "../atoms/userAtom";
+// import { useSocket } from "../context/SocketContext";
+// import { useTranslation } from 'react-i18next'; // Import useTranslation
+
+// const ChatPage = () => {
+// const [searchingUser, setSearchingUser] = useState(false);
+// const [loadingConversations, setLoadingConversations] = useState(true);
+// const [searchText, setSearchText] = useState("");
+// const [selectedConversation, setSelectedConversation] = useRecoilState(selectedConversationAtom);
+// const [conversations, setConversations] = useRecoilState(conversationsAtom);
+// const currentUser = useRecoilValue(userAtom); // Get current user details, including the token
+// const showToast = useShowToast();
+// const { socket, onlineUsers } = useSocket();
+// const { t, i18n } = useTranslation(); // Initialize the translation hook
+// const [language, setLanguage] = useState(i18n.language); // Track current language
+
+// // Handle language changes and update the UI accordingly
+// useEffect(() => {
+// const handleLanguageChange = (lng) => {
+// setLanguage(lng);
+// };
+
+// i18n.on('languageChanged', handleLanguageChange); // Listen for language change
+
+// return () => {
+// i18n.off('languageChanged', handleLanguageChange); // Cleanup on unmount
+// };
+// }, [i18n]);
+
+// useEffect(() => {
+// socket?.on("messagesSeen", ({ conversationId }) => {
+// setConversations((prev) => {
+// const updatedConversations = prev.map((conversation) => {
+// if (conversation._id === conversationId) {
+// return {
+// ...conversation,
+// lastMessage: {
+// ...conversation.lastMessage,
+// seen: true,
+// },
+// };
+// }
+// return conversation;
+// });
+// return updatedConversations;
+// });
+// });
+// }, [socket, setConversations]);
+
+// // Fix for 403 error and ensuring conversations is an array
+// useEffect(() => {
+// const getConversations = async () => {
+// try {
+// const res = await fetch("/api/messages/conversations", {
+// headers: {
+// 'Authorization': `Bearer ${currentUser.token}`, // Ensure token is sent with the request
+// },
+// });
+// const data = await res.json();
+
+// console.log("Conversations API response:", data); // Log API response to debug
+
+// // Check if the data is an array before setting conversations
+// if (!Array.isArray(data)) {
+// showToast(t("Error"), "Unexpected API response format", "error");
+// return;
+// }
+
+// if (data.error) {
+// showToast(t("Error"), data.error, "error");
+// return;
+// }
+
+// setConversations(data); // Set conversations to the returned data
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setLoadingConversations(false); // Stop loading once the request completes
+// }
+// };
+
+// getConversations();
+// }, [showToast, setConversations, t, currentUser.token]);
+
+// const handleConversationSearch = async (e) => {
+// e.preventDefault();
+// setSearchingUser(true);
+// try {
+// const res = await fetch(`/api/users/profile/${searchText}`);
+// const searchedUser = await res.json();
+// if (searchedUser.error) {
+// showToast(t("Error"), searchedUser.error, "error");
+// return;
+// }
+
+// const messagingYourself = searchedUser._id === currentUser._id;
+// if (messagingYourself) {
+// showToast(t("Error"), t("You cannot message yourself"), "error");
+// return;
+// }
+
+// const conversationAlreadyExists = conversations.find(
+// (conversation) => conversation.participants[0]._id === searchedUser._id
+// );
+
+// if (conversationAlreadyExists) {
+// setSelectedConversation({
+// _id: conversationAlreadyExists._id,
+// userId: searchedUser._id,
+// username: searchedUser.username,
+// userProfilePic: searchedUser.profilePic,
+// });
+// return;
+// }
+
+// const mockConversation = {
+// mock: true,
+// lastMessage: {
+// text: "",
+// sender: "",
+// },
+// _id: Date.now(),
+// participants: [
+// {
+// _id: searchedUser._id,
+// username: searchedUser.username,
+// profilePic: searchedUser.profilePic,
+// },
+// ],
+// };
+// setConversations((prevConvs) => [...prevConvs, mockConversation]);
+// } catch (error) {
+// showToast(t("Error"), error.message, "error");
+// } finally {
+// setSearchingUser(false);
+// }
+// };
+
+// return (
+//
+//
+//
+//
+// {t("Your Conversations")}
+//
+//
+
+// {loadingConversations &&
+// [0, 1, 2, 3, 4].map((_, i) => (
+//
+//
+//
+//
+//
+//
+//
+//
+//
+// ))}
+
+// {/* Ensure conversations is an array before mapping */}
+// {!loadingConversations && Array.isArray(conversations) &&
+// conversations.map((conversation) => (
+//
+// ))
+// }
+//
+
+// {!selectedConversation._id && (
+//
+//
+// {t("Select a conversation to start messaging")}
+//
+// )}
+
+// {selectedConversation._id && }
+//
+//
+// );
+// };
+
+// export default ChatPage;
+
+// this is the api format issue
import { SearchIcon } from "@chakra-ui/icons";
import { Box, Button, Flex, Input, Skeleton, SkeletonCircle, Text, useColorModeValue } from "@chakra-ui/react";
import Conversation from "../components/Conversation";
@@ -9,183 +640,224 @@ import { useRecoilState, useRecoilValue } from "recoil";
import { conversationsAtom, selectedConversationAtom } from "../atoms/messagesAtom";
import userAtom from "../atoms/userAtom";
import { useSocket } from "../context/SocketContext";
+import { useTranslation } from 'react-i18next';
const ChatPage = () => {
- const [searchingUser, setSearchingUser] = useState(false);
- const [loadingConversations, setLoadingConversations] = useState(true);
- const [searchText, setSearchText] = useState("");
- const [selectedConversation, setSelectedConversation] = useRecoilState(selectedConversationAtom);
- const [conversations, setConversations] = useRecoilState(conversationsAtom);
- const currentUser = useRecoilValue(userAtom);
- const showToast = useShowToast();
- const { socket, onlineUsers } = useSocket();
-
- useEffect(() => {
- socket?.on("messagesSeen", ({ conversationId }) => {
- setConversations((prev) => {
- const updatedConversations = prev.map((conversation) => {
- if (conversation._id === conversationId) {
- return {
- ...conversation,
- lastMessage: {
- ...conversation.lastMessage,
- seen: true,
- },
- };
- }
- return conversation;
- });
- return updatedConversations;
- });
- });
- }, [socket, setConversations]);
-
- useEffect(() => {
- const getConversations = async () => {
- try {
- const res = await fetch("/api/messages/conversations");
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- console.log(data);
- setConversations(data);
- } catch (error) {
- showToast("Error", error.message, "error");
- } finally {
- setLoadingConversations(false);
- }
- };
-
- getConversations();
- }, [showToast, setConversations]);
-
- const handleConversationSearch = async (e) => {
- e.preventDefault();
- setSearchingUser(true);
- try {
- const res = await fetch(`/api/users/profile/${searchText}`);
- const searchedUser = await res.json();
- if (searchedUser.error) {
- showToast("Error", searchedUser.error, "error");
- return;
- }
-
- const messagingYourself = searchedUser._id === currentUser._id;
- if (messagingYourself) {
- showToast("Error", "You cannot message yourself", "error");
- return;
- }
-
- const conversationAlreadyExists = conversations.find(
- (conversation) => conversation.participants[0]._id === searchedUser._id
- );
-
- if (conversationAlreadyExists) {
- setSelectedConversation({
- _id: conversationAlreadyExists._id,
- userId: searchedUser._id,
- username: searchedUser.username,
- userProfilePic: searchedUser.profilePic,
- });
- return;
- }
-
- const mockConversation = {
- mock: true,
- lastMessage: {
- text: "",
- sender: "",
- },
- _id: Date.now(),
- participants: [
- {
- _id: searchedUser._id,
- username: searchedUser.username,
- profilePic: searchedUser.profilePic,
- },
- ],
- };
- setConversations((prevConvs) => [...prevConvs, mockConversation]);
- } catch (error) {
- showToast("Error", error.message, "error");
- } finally {
- setSearchingUser(false);
- }
- };
-
- return (
-
-
-
-
- Your Conversations
-
-
-
- {loadingConversations &&
- [0, 1, 2, 3, 4].map((_, i) => (
-
-
-
-
-
-
-
-
-
- ))}
-
- {!loadingConversations &&
- conversations.map((conversation) => (
-
- ))}
-
- {!selectedConversation._id && (
-
-
- Select a conversation to start messaging
-
- )}
-
- {selectedConversation._id && }
-
-
- );
+ const [searchingUser, setSearchingUser] = useState(false);
+ const [loadingConversations, setLoadingConversations] = useState(true);
+ const [searchText, setSearchText] = useState("");
+ const [selectedConversation, setSelectedConversation] = useRecoilState(selectedConversationAtom);
+ const [conversations, setConversations] = useRecoilState(conversationsAtom);
+ const currentUser = useRecoilValue(userAtom);
+ const showToast = useShowToast();
+ const { socket, onlineUsers } = useSocket();
+ const { t, i18n } = useTranslation();
+ const [language, setLanguage] = useState(i18n.language);
+
+ useEffect(() => {
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on('languageChanged', handleLanguageChange);
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange);
+ };
+ }, [i18n]);
+
+ useEffect(() => {
+ socket?.on("messagesSeen", ({ conversationId }) => {
+ setConversations((prev) => {
+ return prev.map((conversation) => {
+ if (conversation._id === conversationId) {
+ return {
+ ...conversation,
+ lastMessage: {
+ ...conversation.lastMessage,
+ seen: true,
+ },
+ };
+ }
+ return conversation;
+ });
+ });
+ });
+ }, [socket, setConversations]);
+
+ useEffect(() => {
+ const getConversations = async () => {
+ try {
+ const res = await fetch("/api/messages/conversations", {
+ headers: {
+ 'Authorization': `Bearer ${currentUser.token}`,
+ },
+ });
+
+ const data = await res.json();
+
+ if (!res.ok) {
+ showToast(t("Error"), data.error || t("Failed to fetch conversations"), "error");
+ setConversations([]);
+ return;
+ }
+
+ if (!Array.isArray(data)) {
+ throw new Error(t("Invalid response format"));
+ }
+
+ setConversations(data);
+ } catch (error) {
+ showToast(t("Error"), error.message, "error");
+ setConversations([]);
+ } finally {
+ setLoadingConversations(false);
+ }
+ };
+
+ getConversations();
+ }, [showToast, setConversations, t, currentUser.token]);
+
+ const handleConversationSearch = async (e) => {
+ e.preventDefault();
+ setSearchingUser(true);
+ try {
+ const res = await fetch(`/api/users/profile/${searchText}`, {
+ headers: {
+ 'Authorization': `Bearer ${currentUser.token}`,
+ },
+ });
+ const searchedUser = await res.json();
+
+ if (!res.ok) {
+ showToast(t("Error"), searchedUser.error || t("User not found"), "error");
+ return;
+ }
+
+ if (searchedUser._id === currentUser._id) {
+ showToast(t("Error"), t("You cannot message yourself"), "error");
+ return;
+ }
+
+ const conversationAlreadyExists = conversations.find(
+ (conversation) => conversation.participants[0]._id === searchedUser._id
+ );
+
+ if (conversationAlreadyExists) {
+ setSelectedConversation({
+ _id: conversationAlreadyExists._id,
+ userId: searchedUser._id,
+ username: searchedUser.username,
+ userProfilePic: searchedUser.profilePic,
+ });
+ return;
+ }
+
+ const mockConversation = {
+ mock: true,
+ lastMessage: {
+ text: "",
+ sender: "",
+ },
+ _id: Date.now(),
+ participants: [
+ {
+ _id: searchedUser._id,
+ username: searchedUser.username,
+ profilePic: searchedUser.profilePic,
+ },
+ ],
+ };
+ setConversations((prevConvs) => [...prevConvs, mockConversation]);
+ } catch (error) {
+ showToast(t("Error"), error.message, "error");
+ } finally {
+ setSearchingUser(false);
+ }
+ };
+
+ return (
+
+
+
+
+ {t("Your Conversations")}
+
+
+
+ {loadingConversations &&
+ [0, 1, 2, 3, 4].map((_, i) => (
+
+
+
+
+
+
+
+
+
+ ))}
+
+ {!loadingConversations && (
+ Array.isArray(conversations) && conversations.length > 0 ? (
+ conversations.map((conversation) => (
+
+ ))
+ ) : (
+
+ {t("No conversations found")}
+
+ )
+ )}
+
+
+ {!selectedConversation._id && (
+
+
+ {t("Select a conversation to start messaging")}
+
+ )}
+
+ {selectedConversation._id && }
+
+
+ );
};
-export default ChatPage;
+export default ChatPage;
\ No newline at end of file
diff --git a/frontend/src/pages/HomePage.jsx b/frontend/src/pages/HomePage.jsx
index bc06afc..7a8ab4f 100644
--- a/frontend/src/pages/HomePage.jsx
+++ b/frontend/src/pages/HomePage.jsx
@@ -1,15 +1,370 @@
-import { Box, Flex, Spinner } from "@chakra-ui/react";
+// // version 1 original
+// import { Box, Flex, Spinner } from "@chakra-ui/react";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import Post from "../components/Post";
+// import { useRecoilState } from "recoil";
+// import postsAtom from "../atoms/postsAtom";
+// import SuggestedUsers from "../components/SuggestedUsers";
+
+// const HomePage = () => {
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const [loading, setLoading] = useState(true);
+// const showToast = useShowToast();
+// useEffect(() => {
+// const getFeedPosts = async () => {
+// setLoading(true);
+// setPosts([]);
+// try {
+// const res = await fetch("/api/posts/feed");
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// console.log(data);
+// setPosts(data);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setLoading(false);
+// }
+// };
+// getFeedPosts();
+// }, [showToast, setPosts]);
+
+// return (
+//
+//
+// {!loading && posts.length === 0 && Follow users for the latest Brookhouse news.
}
+
+// {loading && (
+//
+//
+//
+// )}
+
+// {posts.map((post) => (
+//
+// ))}
+//
+//
+//
+//
+//
+// );
+// };
+
+// export default HomePage;
+
+
+// version 2 this is the animated posts with green tint (this is before the disabled suggested users)
+// import { Box, Flex, Spinner } from "@chakra-ui/react";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import Post from "../components/Post";
+// import { useRecoilState } from "recoil";
+// import postsAtom from "../atoms/postsAtom";
+// import SuggestedUsers from "../components/SuggestedUsers";
+
+// const HomePage = () => {
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const [loading, setLoading] = useState(true);
+// const showToast = useShowToast();
+
+// useEffect(() => {
+// const getFeedPosts = async () => {
+// setLoading(true);
+// setPosts([]);
+// try {
+// const res = await fetch("/api/posts/feed");
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// console.log(data);
+// setPosts(data);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setLoading(false);
+// }
+// };
+// getFeedPosts();
+// }, [showToast, setPosts]);
+
+// return (
+//
+//
+// {!loading && posts.length === 0 && (
+// Follow users for the latest Brookhouse news.
+// )}
+
+// {loading && (
+//
+//
+//
+// )}
+
+// {posts.map((post) => (
+//
+// {/* Assuming Post component takes care of image and content */}
+//
+//
+// ))}
+//
+
+//
+//
+//
+//
+// );
+// };
+
+// export default HomePage;
+
+// this is is home page with sugggested users disable version 3 working
+// import { Box, Flex, Spinner } from "@chakra-ui/react";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import Post from "../components/Post";
+// import { useRecoilState } from "recoil";
+// import postsAtom from "../atoms/postsAtom";
+// // import SuggestedUsers from "../components/SuggestedUsers"; // Commented out the import
+
+// const HomePage = () => {
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const [loading, setLoading] = useState(true);
+// const showToast = useShowToast();
+
+// useEffect(() => {
+// const getFeedPosts = async () => {
+// setLoading(true);
+// setPosts([]);
+// try {
+// const res = await fetch("/api/posts/feed");
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// console.log(data);
+// setPosts(data);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setLoading(false);
+// }
+// };
+// getFeedPosts();
+// }, [showToast, setPosts]);
+
+// return (
+//
+//
+// {!loading && posts.length === 0 && (
+// welcome to pear you have succesfully created an account login in to see the latest brookhouse news.
+// )}
+
+// {loading && (
+//
+//
+//
+// )}
+
+// {posts.map((post) => (
+//
+// {/* Assuming Post component takes care of image and content */}
+//
+//
+// ))}
+//
+
+// {/*
+//
+//
+//
+// */}
+//
+// );
+// };
+
+// export default HomePage;
+
+
+
+
+// adding the new posts working
+// import { Box, Flex, Spinner, Text } from "@chakra-ui/react";
+// import { useEffect, useState } from "react";
+// import useShowToast from "../hooks/useShowToast";
+// import Post from "../components/Post";
+// import { useRecoilState } from "recoil";
+// import postsAtom from "../atoms/postsAtom";
+// import '../index.css'; // Ensure correct CSS is imported
+
+// const HomePage = () => {
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const [loading, setLoading] = useState(true);
+// const [newPosts, setNewPosts] = useState([]);
+// const showToast = useShowToast();
+
+// useEffect(() => {
+// const getFeedPosts = async () => {
+// setLoading(true);
+// setPosts([]);
+// try {
+// const res = await fetch("/api/posts/feed");
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// setPosts(data);
+
+// const now = Date.now();
+// const recentPosts = data.filter(post => {
+// const postAgeInHours = (now - new Date(post.createdAt).getTime()) / (1000 * 60 * 60);
+// return postAgeInHours <= 3; // Check if post is within 1-3 hours
+// });
+// setNewPosts(recentPosts);
+
+// setTimeout(() => {
+// setNewPosts([]);
+// }, 30000); // "New to you" message disappears after 30 seconds
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// } finally {
+// setLoading(false);
+// }
+// };
+// getFeedPosts();
+// }, [showToast, setPosts]);
+
+// const isNewPost = (postTime) => {
+// const now = Date.now();
+// const postAgeInHours = (now - new Date(postTime).getTime()) / (1000 * 60 * 60);
+// return postAgeInHours <= 3;
+// };
+
+// return (
+//
+//
+// {!loading && posts.length === 0 && (
+// Welcome to Pear! You have successfully created an account. Log in to see the latest Brookhouse news.
+// )}
+
+// {loading && (
+//
+//
+//
+// )}
+
+// {posts.map((post) => {
+// const isNew = isNewPost(post.createdAt);
+
+// return (
+//
+//
+
+// {isNew && newPosts.includes(post) && (
+// New to you!
+// )}
+//
+// );
+// })}
+//
+//
+// );
+// };
+
+// export default HomePage;
+
+
+// this is with translations added(working)
+import { Box, Flex, Spinner, Text } from "@chakra-ui/react";
import { useEffect, useState } from "react";
import useShowToast from "../hooks/useShowToast";
import Post from "../components/Post";
import { useRecoilState } from "recoil";
import postsAtom from "../atoms/postsAtom";
-import SuggestedUsers from "../components/SuggestedUsers";
+import { useTranslation } from 'react-i18next'; // Import useTranslation
+import '../index.css'; // Ensure correct CSS is imported
const HomePage = () => {
const [posts, setPosts] = useRecoilState(postsAtom);
const [loading, setLoading] = useState(true);
+ const [newPosts, setNewPosts] = useState([]);
const showToast = useShowToast();
+ const { t, i18n } = useTranslation(); // Initialize the translation hook
+ const [language, setLanguage] = useState(i18n.language); // Add language state
+
+ // Handle language changes
+ useEffect(() => {
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on('languageChanged', handleLanguageChange); // Listen for language changes
+
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange); // Cleanup on unmount
+ };
+ }, [i18n]);
+
useEffect(() => {
const getFeedPosts = async () => {
setLoading(true);
@@ -17,44 +372,81 @@ const HomePage = () => {
try {
const res = await fetch("/api/posts/feed");
const data = await res.json();
+
if (data.error) {
- showToast("Error", data.error, "error");
+ // Ensure that the toast is only shown if the user retrieval truly fails
+ showToast(t("Error"), data.error, "error");
return;
}
- console.log(data);
+
setPosts(data);
+
+ const now = Date.now();
+ const recentPosts = data.filter(post => {
+ const postAgeInHours = (now - new Date(post.createdAt).getTime()) / (1000 * 60 * 60);
+ return postAgeInHours <= 3; // Check if post is within 1-3 hours
+ });
+ setNewPosts(recentPosts);
+
+ setTimeout(() => {
+ setNewPosts([]);
+ }, 30000); // "New to you" message disappears after 30 seconds
} catch (error) {
- showToast("Error", error.message, "error");
+ // Make sure the error here is valid (e.g., network error or actual server issue)
+ if (error.message.includes('User not found')) {
+ // Suppress "User not found" error on the HomePage
+ console.warn("User retrieval failed but no toast shown");
+ } else {
+ showToast(t("Error"), error.message, "error");
+ }
} finally {
setLoading(false);
}
};
getFeedPosts();
- }, [showToast, setPosts]);
+ }, [showToast, setPosts, t]);
+
+
+ const isNewPost = (postTime) => {
+ const now = Date.now();
+ const postAgeInHours = (now - new Date(postTime).getTime()) / (1000 * 60 * 60);
+ return postAgeInHours <= 3;
+ };
return (
-
+
- {!loading && posts.length === 0 && Follow some users to see the feed
}
+ {!loading && posts.length === 0 && (
+ {t("Welcome to Pear! You have successfully created an account. Log in to see the latest Brookhouse news 🍐.")}
+ )}
{loading && (
-
-
+
+
)}
- {posts.map((post) => (
-
- ))}
-
-
-
+ {posts.map((post) => {
+ const isNew = isNewPost(post.createdAt);
+
+ return (
+
+
+
+ {isNew && newPosts.includes(post) && (
+ {t("New to you!")}
+ )}
+
+ );
+ })}
);
diff --git a/frontend/src/pages/PostPage.jsx b/frontend/src/pages/PostPage.jsx
index 6f2001d..1d11e35 100644
--- a/frontend/src/pages/PostPage.jsx
+++ b/frontend/src/pages/PostPage.jsx
@@ -1,6 +1,140 @@
-import { Avatar, Box, Button, Divider, Flex, Image, Spinner, Text } from "@chakra-ui/react";
+// working version one
+// import { Avatar, Box, Button, Divider, Flex, Image, Spinner, Text } from "@chakra-ui/react";
+// import Actions from "../components/Actions";
+// import { useEffect } from "react";
+// import Comment from "../components/Comment";
+// import useGetUserProfile from "../hooks/useGetUserProfile";
+// import useShowToast from "../hooks/useShowToast";
+// import { useNavigate, useParams } from "react-router-dom";
+// import { formatDistanceToNow } from "date-fns";
+// import { useRecoilState, useRecoilValue } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import { DeleteIcon } from "@chakra-ui/icons";
+// import postsAtom from "../atoms/postsAtom";
+
+// const PostPage = () => {
+// const { user, loading } = useGetUserProfile();
+// const [posts, setPosts] = useRecoilState(postsAtom);
+// const showToast = useShowToast();
+// const { pid } = useParams();
+// const currentUser = useRecoilValue(userAtom);
+// const navigate = useNavigate();
+
+// const currentPost = posts[0];
+
+// useEffect(() => {
+// const getPost = async () => {
+// setPosts([]);
+// try {
+// const res = await fetch(`/api/posts/${pid}`);
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// setPosts([data]);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// }
+// };
+// getPost();
+// }, [showToast, pid, setPosts]);
+
+// const handleDeletePost = async () => {
+// try {
+// if (!window.confirm("Are you sure you want to delete this post?")) return;
+
+// const res = await fetch(`/api/posts/${currentPost._id}`, {
+// method: "DELETE",
+// });
+// const data = await res.json();
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// showToast("Success", "Post deleted", "success");
+// navigate(`/${user.username}`);
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// }
+// };
+
+// if (!user && loading) {
+// return (
+//
+//
+//
+// );
+// }
+
+// if (!currentPost) return null;
+// console.log("currentPost", currentPost);
+
+// return (
+// <>
+//
+//
+//
+//
+//
+// {user.username}
+//
+//
+//
+//
+//
+//
+// {formatDistanceToNow(new Date(currentPost.createdAt))} ago
+//
+
+// {currentUser?._id === user._id && (
+//
+// )}
+//
+//
+
+// {currentPost.text}
+
+// {currentPost.img && (
+//
+//
+//
+// )}
+
+//
+//
+//
+
+//
+// {/* temporarily disbled the get button */}
+
+//
+//
+// 🍐
+// The application is coming to your phone soon.
+//
+// {/* */}
+//
+
+//
+// {currentPost.replies.map((reply) => (
+//
+// ))}
+// >
+// );
+// };
+
+// export default PostPage;
+
+
+// verison two with transaltions
+import { Avatar, Box, Divider, Flex, Image, Spinner, Text } from "@chakra-ui/react";
import Actions from "../components/Actions";
-import { useEffect } from "react";
+import { useEffect, useState } from "react";
import Comment from "../components/Comment";
import useGetUserProfile from "../hooks/useGetUserProfile";
import useShowToast from "../hooks/useShowToast";
@@ -10,120 +144,147 @@ import { useRecoilState, useRecoilValue } from "recoil";
import userAtom from "../atoms/userAtom";
import { DeleteIcon } from "@chakra-ui/icons";
import postsAtom from "../atoms/postsAtom";
+import { useTranslation } from "react-i18next";
const PostPage = () => {
- const { user, loading } = useGetUserProfile();
- const [posts, setPosts] = useRecoilState(postsAtom);
- const showToast = useShowToast();
- const { pid } = useParams();
- const currentUser = useRecoilValue(userAtom);
- const navigate = useNavigate();
-
- const currentPost = posts[0];
-
- useEffect(() => {
- const getPost = async () => {
- setPosts([]);
- try {
- const res = await fetch(`/api/posts/${pid}`);
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- setPosts([data]);
- } catch (error) {
- showToast("Error", error.message, "error");
- }
- };
- getPost();
- }, [showToast, pid, setPosts]);
-
- const handleDeletePost = async () => {
- try {
- if (!window.confirm("Are you sure you want to delete this post?")) return;
-
- const res = await fetch(`/api/posts/${currentPost._id}`, {
- method: "DELETE",
- });
- const data = await res.json();
- if (data.error) {
- showToast("Error", data.error, "error");
- return;
- }
- showToast("Success", "Post deleted", "success");
- navigate(`/${user.username}`);
- } catch (error) {
- showToast("Error", error.message, "error");
- }
- };
-
- if (!user && loading) {
- return (
-
-
-
- );
- }
-
- if (!currentPost) return null;
- console.log("currentPost", currentPost);
-
- return (
- <>
-
-
-
-
-
- {user.username}
-
-
-
-
-
-
- {formatDistanceToNow(new Date(currentPost.createdAt))} ago
-
-
- {currentUser?._id === user._id && (
-
- )}
-
-
-
- {currentPost.text}
-
- {currentPost.img && (
-
-
-
- )}
-
-
-
-
-
-
-
-
-
- 👋
- Get the app to like, reply and post.
-
-
-
-
-
- {currentPost.replies.map((reply) => (
-
- ))}
- >
- );
+ const { t } = useTranslation();
+ const { user, loading } = useGetUserProfile();
+ const [posts, setPosts] = useRecoilState(postsAtom);
+ const showToast = useShowToast();
+ const { pid } = useParams();
+ const currentUser = useRecoilValue(userAtom);
+ const navigate = useNavigate();
+ const [loadingPost, setLoadingPost] = useState(true);
+
+ const handleDeletePost = async (postId) => {
+ try {
+ const res = await fetch(`/api/posts/${postId}`, {
+ method: "DELETE",
+ headers: {
+ Authorization: `Bearer ${currentUser.token}`,
+ },
+ });
+
+ if (!res.ok) {
+ const errorData = await res.json();
+ showToast(t("Error"), errorData.error || t("Failed to delete post"), "error");
+ return;
+ }
+
+ navigate("/");
+ showToast(t("Success"), t("Post deleted successfully"), "success");
+ } catch (error) {
+ showToast(t("Error"), error.message || t("Failed to delete post"), "error");
+ }
+ };
+
+ const handleDeleteComment = (deletedCommentId) => {
+ setPosts(prevPosts => {
+ const updatedPost = {
+ ...prevPosts[0],
+ replies: prevPosts[0].replies.filter(reply => reply._id !== deletedCommentId)
+ };
+ return [updatedPost];
+ });
+ };
+
+ useEffect(() => {
+ const getPost = async () => {
+ setLoadingPost(true);
+ try {
+ const res = await fetch(`/api/posts/${pid}`);
+ const data = await res.json();
+
+ if (!res.ok) {
+ showToast(t("Error"), data.error || t("Something went wrong"), "error");
+ return;
+ }
+
+ setPosts([data]);
+ } catch (error) {
+ showToast(t("Error"), error.message || t("Something went wrong"), "error");
+ } finally {
+ setLoadingPost(false);
+ }
+ };
+ getPost();
+ }, [showToast, pid, setPosts, t]);
+
+ if (!user && loading) {
+ return (
+
+
+
+ );
+ }
+
+ if (loadingPost) {
+ return (
+
+
+
+ );
+ }
+
+ const currentPost = posts[0];
+
+ if (!currentPost) return {t("No post found.")};
+
+ return (
+ <>
+
+
+
+
+
+ {user.username}
+
+
+
+
+
+
+ {formatDistanceToNow(new Date(currentPost.createdAt))} {t("ago")}
+
+ {(currentUser?.role === "admin" || currentUser?._id === user._id) && (
+ handleDeletePost(currentPost._id)}
+ />
+ )}
+
+
+
+ {currentPost.text}
+
+ {currentPost.img && (
+
+
+
+ )}
+
+
+
+
+
+
+
+ {currentPost.replies?.map((reply, index) => (
+
+ ))}
+ >
+ );
};
-export default PostPage;
+export default PostPage;
\ No newline at end of file
diff --git a/frontend/src/pages/SettingsPage.jsx b/frontend/src/pages/SettingsPage.jsx
index 63bb341..e7d9cf7 100644
--- a/frontend/src/pages/SettingsPage.jsx
+++ b/frontend/src/pages/SettingsPage.jsx
@@ -1,42 +1,404 @@
-import { Button, Text } from "@chakra-ui/react";
-import useShowToast from "../hooks/useShowToast";
-import useLogout from "../hooks/useLogout";
+// version one without language switcher
+// import { Button, Text } from "@chakra-ui/react";
+// import useShowToast from "../hooks/useShowToast";
+// import useLogout from "../hooks/useLogout";
+
+// export const SettingsPage = () => {
+// const showToast = useShowToast();
+// const logout = useLogout();
+
+// const freezeAccount = async () => {
+// if (!window.confirm("Are you sure you want to freeze your account?")) return;
+
+// try {
+// const res = await fetch("/api/users/freeze", {
+// method: "PUT",
+// headers: { "Content-Type": "application/json" },
+// });
+// const data = await res.json();
+
+// if (data.error) {
+// return showToast("Error", data.error, "error");
+// }
+// if (data.success) {
+// await logout();
+// showToast("Success", "Your account has been frozen", "success");
+// }
+// } catch (error) {
+// showToast("Error", error.message, "error");
+// }
+// };
+
+// return (
+// <>
+//
+// Freeze Your Account
+//
+// You can unfreeze your account anytime by logging in.
+//
+// >
+// );
+// };
+
+
+// version 2 working version with change of langauge feature
+// import React from 'react';
+// import { Button, Text } from '@chakra-ui/react';
+// import useShowToast from '../hooks/useShowToast';
+// import useLogout from '../hooks/useLogout';
+// import i18n from '../i18n'; // Import i18n
+
+// export const SettingsPage = () => {
+// const showToast = useShowToast();
+// const logout = useLogout();
+
+// const freezeAccount = async () => {
+// if (!window.confirm(i18n.t("Are you sure you want to freeze your account?"))) return;
+
+// try {
+// const res = await fetch('/api/users/freeze', {
+// method: 'PUT',
+// headers: { 'Content-Type': 'application/json' },
+// });
+// const data = await res.json();
+
+// if (data.error) {
+// return showToast('Error', data.error, 'error');
+// }
+// if (data.success) {
+// await logout();
+// showToast('Success', i18n.t('Your account has been frozen'), 'success');
+// }
+// } catch (error) {
+// showToast('Error', error.message, 'error');
+// }
+// };
+
+// const handleLanguageChange = (lng) => {
+// i18n.changeLanguage(lng);
+// localStorage.setItem('language', lng);
+// };
+
+// return (
+// <>
+//
+// {i18n.t('Freeze Your Account')}
+//
+//
+// {i18n.t('You can unfreeze your account anytime by logging in.')}
+//
+//
+//
+//
+// >
+// );
+// };
+
+// version 3 pauseeeeeee this is woring witht the langauge changer butons only working in the settings thoughb
+// import React from 'react';
+// import { Button, Text, Spinner } from '@chakra-ui/react';
+// import useShowToast from '../hooks/useShowToast';
+// import useLogout from '../hooks/useLogout';
+// import i18n from '../i18n'; // Import i18n
+
+// export const SettingsPage = () => {
+// const showToast = useShowToast();
+// const logout = useLogout();
+// const [loading, setLoading] = React.useState(false);
+
+// const freezeAccount = async () => {
+// if (!window.confirm(i18n.t("Are you sure you want to freeze your account?"))) return;
+
+// try {
+// const res = await fetch('/api/users/freeze', {
+// method: 'PUT',
+// headers: { 'Content-Type': 'application/json' },
+// });
+// const data = await res.json();
+
+// if (data.error) {
+// return showToast('Error', data.error, 'error');
+// }
+// if (data.success) {
+// await logout();
+// showToast('Success', i18n.t('Your account has been frozen'), 'success');
+// }
+// } catch (error) {
+// showToast('Error', error.message, 'error');
+// }
+// };
+
+// const handleLanguageChange = (lng) => {
+// setLoading(true);
+// i18n.changeLanguage(lng).then(() => {
+// localStorage.setItem('language', lng);
+// setLoading(false);
+// });
+// };
+
+// return (
+// <>
+//
+// {i18n.t('Freeze Your Account')}
+//
+//
+// {i18n.t('You can unfreeze your account anytime by logging in.')}
+//
+//
+// {loading ? (
+//
+// ) : (
+// <>
+//
+//
+// >
+// )}
+// >
+// );
+// };
+
+
+
+// slight update to th settings for the langauge changer
+// import React from 'react';
+// import { Button, Text, Spinner } from '@chakra-ui/react';
+// import useShowToast from '../hooks/useShowToast';
+// import useLogout from '../hooks/useLogout';
+// import i18n from '../i18n'; // Import i18n
+
+// export const SettingsPage = () => {
+// const showToast = useShowToast();
+// const logout = useLogout();
+// const [loading, setLoading] = React.useState(false);
+
+// const freezeAccount = async () => {
+// if (!window.confirm(i18n.t("Are you sure you want to freeze your account?"))) return;
+
+// try {
+// const res = await fetch('/api/users/freeze', {
+// method: 'PUT',
+// headers: { 'Content-Type': 'application/json' },
+// });
+// const data = await res.json();
+
+// if (data.error) {
+// return showToast('Error', data.error, 'error');
+// }
+// if (data.success) {
+// await logout();
+// showToast('Success', i18n.t('Your account has been frozen'), 'success');
+// }
+// } catch (error) {
+// showToast('Error', error.message, 'error');
+// }
+// };
+
+// const handleLanguageChange = (lng) => {
+// setLoading(true);
+// i18n.changeLanguage(lng).then(() => {
+// localStorage.setItem('language', lng);
+// setLoading(false);
+// });
+// };
+
+// return (
+// <>
+//
+// {i18n.t('Freeze Your Account')}
+//
+//
+// {i18n.t('You can unfreeze your account anytime by logging in.')}
+//
+//
+// {loading ? (
+//
+// ) : (
+// <>
+//
+//
+// >
+// )}
+// >
+// );
+// };
+
+
+// post notis
+import React from 'react';
+import { Button, Text, Spinner, Switch, HStack, useToast } from '@chakra-ui/react';
+import useShowToast from '../hooks/useShowToast';
+import useLogout from '../hooks/useLogout';
+import i18n from '../i18n';
export const SettingsPage = () => {
- const showToast = useShowToast();
- const logout = useLogout();
-
- const freezeAccount = async () => {
- if (!window.confirm("Are you sure you want to freeze your account?")) return;
-
- try {
- const res = await fetch("/api/users/freeze", {
- method: "PUT",
- headers: { "Content-Type": "application/json" },
- });
- const data = await res.json();
-
- if (data.error) {
- return showToast("Error", data.error, "error");
- }
- if (data.success) {
- await logout();
- showToast("Success", "Your account has been frozen", "success");
- }
- } catch (error) {
- showToast("Error", error.message, "error");
- }
- };
-
- return (
- <>
-
- Freeze Your Account
-
- You can unfreeze your account anytime by logging in.
-
- >
- );
-};
+ const showToast = useShowToast();
+ const logout = useLogout();
+ const [loading, setLoading] = React.useState(false);
+ const [notificationsEnabled, setNotificationsEnabled] = React.useState(true);
+ const [isToggling, setIsToggling] = React.useState(false);
+
+ // Fetch initial notification preferences when component mounts
+ React.useEffect(() => {
+ const fetchNotificationPreferences = async () => {
+ try {
+ const res = await fetch('/api/users/me');
+ const data = await res.json();
+ if (data.notificationPreferences !== undefined) {
+ setNotificationsEnabled(data.notificationPreferences);
+ }
+ } catch (error) {
+ console.error('Error fetching notification preferences:', error);
+ }
+ };
+
+ fetchNotificationPreferences();
+ }, []);
+
+ const toggleNotifications = async () => {
+ setIsToggling(true);
+ try {
+ const res = await fetch('/api/posts/toggle-notifications', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ },
+ credentials: 'include'
+ });
+ const data = await res.json();
+
+ if (data.error) {
+ showToast('Error', data.error, 'error');
+ return;
+ }
+
+ setNotificationsEnabled(data.notificationPreferences);
+ showToast(
+ 'Success',
+ `${i18n.t('Email notifications')} ${data.notificationPreferences ? i18n.t('enabled') : i18n.t('disabled')}`,
+ 'success'
+ );
+ } catch (error) {
+ showToast('Error', error.message, 'error');
+ } finally {
+ setIsToggling(false);
+ }
+ };
+
+ const freezeAccount = async () => {
+ if (!window.confirm(i18n.t("Are you sure you want to freeze your account?"))) return;
+
+ try {
+ const res = await fetch('/api/users/freeze', {
+ method: 'PUT',
+ headers: { 'Content-Type': 'application/json' },
+ });
+ const data = await res.json();
+
+ if (data.error) {
+ return showToast('Error', data.error, 'error');
+ }
+ if (data.success) {
+ await logout();
+ showToast('Success', i18n.t('Your account has been frozen'), 'success');
+ }
+ } catch (error) {
+ showToast('Error', error.message, 'error');
+ }
+ };
+
+ const handleLanguageChange = (lng) => {
+ setLoading(true);
+ i18n.changeLanguage(lng).then(() => {
+ localStorage.setItem('language', lng);
+ setLoading(false);
+ });
+ };
+
+ return (
+ <>
+ {/* Notification Settings Section */}
+
+ {i18n.t('Email Notifications')}
+
+
+
+
+ {notificationsEnabled
+ ? i18n.t('Receive email notifications for new posts')
+ : i18n.t('Email notifications are disabled')}
+
+ {isToggling && }
+
+
+ {/* Account Freeze Section */}
+
+ {i18n.t('Freeze Your Account')}
+
+
+ {i18n.t('You can unfreeze your account anytime by logging in.')}
+
+
+
+ {/* Language Selection Section */}
+ {loading ? (
+
+ ) : (
+ <>
+
+
+ >
+ )}
+ >
+ );
+};
\ No newline at end of file
diff --git a/frontend/src/pages/TVPage.jsx b/frontend/src/pages/TVPage.jsx
new file mode 100644
index 0000000..fa6a638
--- /dev/null
+++ b/frontend/src/pages/TVPage.jsx
@@ -0,0 +1,175 @@
+import React, { useEffect, useState } from 'react';
+import { Box, Flex, Spinner, Text, useToast } from "@chakra-ui/react";
+import { useRecoilValue } from "recoil";
+import userAtom from "../atoms/userAtom";
+import Post from "../components/Post";
+import { useTranslation } from 'react-i18next';
+
+const TVPage = () => {
+ const [posts, setPosts] = useState([]);
+ const [loading, setLoading] = useState(true);
+ const [currentPostIndex, setCurrentPostIndex] = useState(0);
+ const [error, setError] = useState(null);
+ const [cachedPosts, setCachedPosts] = useState([]);
+ const user = useRecoilValue(userAtom);
+ const { t } = useTranslation();
+ const toast = useToast();
+
+ const SLIDE_DURATION = 7000;
+ const MAX_FEATURED_POSTS = 3;
+
+ useEffect(() => {
+ const loadCachedPosts = () => {
+ const cached = localStorage.getItem('tvPagePosts');
+ if (cached) {
+ setCachedPosts(JSON.parse(cached));
+ setPosts(JSON.parse(cached));
+ setLoading(false);
+ }
+ };
+
+ const fetchPosts = async () => {
+ setLoading(true);
+ try {
+ const res = await fetch("/api/posts/feed");
+ const data = await res.json();
+
+ if (data.error) {
+ setError(data.error);
+ toast({
+ title: t("Error"),
+ description: data.error,
+ status: "error",
+ duration: 3000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ const sortedPosts = data.sort((a, b) => {
+ const aEngagement = (a.likes?.length || 0) + (a.replies?.length || 0);
+ const bEngagement = (b.likes?.length || 0) + (b.replies?.length || 0);
+ return bEngagement - aEngagement;
+ });
+
+ const featuredPosts = sortedPosts.slice(0, MAX_FEATURED_POSTS);
+ setPosts(featuredPosts);
+ localStorage.setItem('tvPagePosts', JSON.stringify(featuredPosts));
+ setCachedPosts(featuredPosts);
+ } catch (error) {
+ setError(error.message);
+ loadCachedPosts();
+ toast({
+ title: t("Network Error"),
+ description: t("Using cached content"),
+ status: "warning",
+ duration: 3000,
+ isClosable: true,
+ });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ if (user?.role !== 'admin') {
+ toast({
+ title: t("Access Denied"),
+ description: t("You don't have permission to view this page"),
+ status: "error",
+ duration: 3000,
+ isClosable: true,
+ });
+ return;
+ }
+
+ fetchPosts();
+
+ const interval = setInterval(() => {
+ setCurrentPostIndex((prevIndex) =>
+ prevIndex === (posts.length - 1) ? 0 : prevIndex + 1
+ );
+ }, SLIDE_DURATION);
+
+ return () => clearInterval(interval);
+ }, [user, t, toast]);
+
+ const Progress = ({ index }) => (
+
+
+
+ );
+
+ if (!user || user.role !== 'admin') {
+ return {t("Access Denied")};
+ }
+
+ return (
+
+ {loading ? (
+
+
+
+ ) : error ? (
+ {error}
+ ) : (
+
+
+ {posts.map((_, index) => (
+
+
+
+ ))}
+
+
+ {posts[currentPostIndex] && (
+
+
+
+ )}
+
+
+ )}
+
+ );
+};
+
+export default TVPage;
\ No newline at end of file
diff --git a/frontend/src/pages/UpdateProfilePage.jsx b/frontend/src/pages/UpdateProfilePage.jsx
index 4890fa9..1e1dcef 100644
--- a/frontend/src/pages/UpdateProfilePage.jsx
+++ b/frontend/src/pages/UpdateProfilePage.jsx
@@ -1,3 +1,356 @@
+// version one is working
+// import {
+// Button,
+// Flex,
+// FormControl,
+// FormLabel,
+// Heading,
+// Input,
+// Stack,
+// useColorModeValue,
+// Avatar,
+// Center,
+// } from "@chakra-ui/react";
+// import { useRef, useState } from "react";
+// import { useRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import usePreviewImg from "../hooks/usePreviewImg";
+// import useShowToast from "../hooks/useShowToast";
+
+// export default function UpdateProfilePage() {
+// const [user, setUser] = useRecoilState(userAtom);
+// const [inputs, setInputs] = useState({
+// name: user.name,
+// username: user.username,
+// email: user.email,
+// bio: user.bio,
+// password: "",
+// });
+// const fileRef = useRef(null);
+// const [updating, setUpdating] = useState(false);
+
+// const showToast = useShowToast();
+
+// const { handleImageChange, imgUrl } = usePreviewImg();
+
+// const handleSubmit = async (e) => {
+// e.preventDefault();
+// if (updating) return;
+// setUpdating(true);
+// try {
+// const res = await fetch(`/api/users/update/${user._id}`, {
+// method: "PUT",
+// headers: {
+// "Content-Type": "application/json",
+// },
+// body: JSON.stringify({ ...inputs, profilePic: imgUrl }),
+// });
+// const data = await res.json(); // updated user object
+// if (data.error) {
+// showToast("Error", data.error, "error");
+// return;
+// }
+// showToast("Success", "Profile updated successfully", "success");
+// setUser(data);
+// localStorage.setItem("user-threads", JSON.stringify(data));
+// } catch (error) {
+// showToast("Error", error, "error");
+// } finally {
+// setUpdating(false);
+// }
+// };
+// return (
+//
+// );
+// }
+
+
+// this is version with updated trabsaltions working
+// import {
+// Button,
+// Flex,
+// FormControl,
+// FormLabel,
+// Heading,
+// Input,
+// Stack,
+// useColorModeValue,
+// Avatar,
+// Center,
+// } from "@chakra-ui/react";
+// import { useRef, useState, useEffect } from "react";
+// import { useRecoilState } from "recoil";
+// import userAtom from "../atoms/userAtom";
+// import usePreviewImg from "../hooks/usePreviewImg";
+// import useShowToast from "../hooks/useShowToast";
+// import { useTranslation } from 'react-i18next'; // Import useTranslation
+
+// export default function UpdateProfilePage() {
+// const [user, setUser] = useRecoilState(userAtom);
+// const [inputs, setInputs] = useState({
+// name: user.name,
+// username: user.username,
+// email: user.email,
+// bio: user.bio,
+// password: "",
+// });
+// const fileRef = useRef(null);
+// const [updating, setUpdating] = useState(false);
+
+// const showToast = useShowToast();
+// const { handleImageChange, imgUrl } = usePreviewImg();
+// const { t, i18n } = useTranslation(); // Initialize the translation hook
+// const [language, setLanguage] = useState(i18n.language); // Add a state for language
+
+// // Handle language change
+// useEffect(() => {
+// const handleLanguageChange = (lng) => {
+// setLanguage(lng);
+// };
+
+// i18n.on('languageChanged', handleLanguageChange);
+
+// return () => {
+// i18n.off('languageChanged', handleLanguageChange);
+// };
+// }, [i18n]);
+
+// const handleSubmit = async (e) => {
+// e.preventDefault();
+// if (updating) return;
+// setUpdating(true);
+// try {
+// const res = await fetch(`/api/users/update/${user._id}`, {
+// method: "PUT",
+// headers: {
+// "Content-Type": "application/json",
+// },
+// body: JSON.stringify({ ...inputs, profilePic: imgUrl }),
+// });
+// const data = await res.json();
+// if (data.error) {
+// showToast(t("Error"), data.error, "error"); // Translate error message
+// return;
+// }
+// showToast(t("Success"), t("Profile updated successfully"), "success"); // Translate success message
+// setUser(data);
+// localStorage.setItem("user-threads", JSON.stringify(data));
+// } catch (error) {
+// showToast(t("Error"), error.message, "error"); // Translate error message
+// } finally {
+// setUpdating(false);
+// }
+// };
+
+// return (
+//
+// );
+// }
+
+// delte butoon update
+
import {
Button,
Flex,
@@ -9,12 +362,15 @@ import {
useColorModeValue,
Avatar,
Center,
+ CloseButton, // Import CloseButton
} from "@chakra-ui/react";
-import { useRef, useState } from "react";
+import { useRef, useState, useEffect } from "react";
import { useRecoilState } from "recoil";
+import { useNavigate } from 'react-router-dom'; // Import useNavigate
import userAtom from "../atoms/userAtom";
import usePreviewImg from "../hooks/usePreviewImg";
import useShowToast from "../hooks/useShowToast";
+import { useTranslation } from 'react-i18next'; // Import useTranslation
export default function UpdateProfilePage() {
const [user, setUser] = useRecoilState(userAtom);
@@ -27,10 +383,24 @@ export default function UpdateProfilePage() {
});
const fileRef = useRef(null);
const [updating, setUpdating] = useState(false);
-
+ const navigate = useNavigate(); // Initialize useNavigate
const showToast = useShowToast();
-
const { handleImageChange, imgUrl } = usePreviewImg();
+ const { t, i18n } = useTranslation(); // Initialize the translation hook
+ const [language, setLanguage] = useState(i18n.language); // Add a state for language
+
+ // Handle language change
+ useEffect(() => {
+ const handleLanguageChange = (lng) => {
+ setLanguage(lng);
+ };
+
+ i18n.on('languageChanged', handleLanguageChange);
+
+ return () => {
+ i18n.off('languageChanged', handleLanguageChange);
+ };
+ }, [i18n]);
const handleSubmit = async (e) => {
e.preventDefault();
@@ -44,20 +414,27 @@ export default function UpdateProfilePage() {
},
body: JSON.stringify({ ...inputs, profilePic: imgUrl }),
});
- const data = await res.json(); // updated user object
+ const data = await res.json();
if (data.error) {
- showToast("Error", data.error, "error");
+ showToast(t("Error"), data.error, "error"); // Translate error message
return;
}
- showToast("Success", "Profile updated successfully", "success");
+ showToast(t("Success"), t("Profile updated successfully"), "success"); // Translate success message
setUser(data);
localStorage.setItem("user-threads", JSON.stringify(data));
} catch (error) {
- showToast("Error", error, "error");
+ showToast(t("Error"), error.message, "error"); // Translate error message
} finally {
setUpdating(false);
}
};
+
+ // Handle delete button click
+ const handleDelete = () => {
+ // Redirect to the user profile page
+ navigate(`/${user.username}`); // Use the username to navigate to the profile page
+ };
+
return (