node error. I have 2 js files and on console I typed “node index.js functions.js” . Please note: im trying to use firebase

please check the error below:
node:internal/process/esm_loader:40
internalBinding(‘errors’).triggerUncaughtException(
^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module ‘D:web devscrimbamobile appfunctions’ imported from D:web devscrimbamobile appindex.js
Did you mean to import ../functions.js?

Given below is the code I’m trying to run: (Index.html, index.js, functions.js)

    <!doctype html>
<html>
    <head>
        <title>Reel Time</title>
        <link rel="preconnect" href="https://fonts.googleapis.com">
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300&family=Ultra&display=swap" rel="stylesheet">
        <link rel="stylesheet" href="index.css">
    </head>
    <body>
        <div class="container">
            <h1>Reel Time</h1>
            <div class="field">
                <input type="text" id="input-field" placeholder="Pulp Fiction">
                <button id="add-button">+</button>
            </div>
        </div>
        <script src="index.js" type="module"></script>
        <script src="functions.js" type="module"></script>
    </body>
</html>

//const readlineSync = require (readlineSync)


import { add } from "./functions"
console.log(add(20,30))

const appSettings = {
    databaseURL: "https://playground-91206-default-rtdb.asia-southeast1.firebasedatabase.app/"

}
const inputFieldEl = document.getElementById("input-field")
const addButtonEl = document.getElementById("add-button")

addButtonEl.addEventListener("click", function() {
    let inputValue = inputFieldEl.value
    
    console.log(`${inputValue} added to database`)
})

 //const readlineSync = require (readlineSync)

export function add(a,b) {
       return a + b
}

PHP post to mysql with dynamic table inside while loop

With some help, I made a truck check form with buttons for pass, warning, and fail. As well as a comment button that adds a line for a comment. This is all being done in a while loop from mysqli_fetch_array.

How do I post the data from the filled out form to the mysql db? I dont have much experience posting to mysql using dynamic table loops.

Example of my form

Here is my code:

<div class="container-xxl flex-grow-1 container-p-y">
             
<h2 align="center"><?php echo $appname?></h2><br />
   <div class="form-group">
   <form name="add_name" id="add_name">
                    
   <div class="table-responsive">
      <table class="table table-bordered" id="dynamic_field">

   <?php while ($checks = mysqli_fetch_array($checksqry)) {
            echo '<tr>';
            echo '<td style="width: 20%">'.$checks['check_name'].' <br><br> 
            <input type="radio" class="btn-check" name="btn[' . $checks['id'] . ']" id="btnpass[' . $checks['id'] . ']" value="Pass">
            <label class="btn rounded-pill btn-outline-success" for="btnpass[' . $checks['id'] . ']">Pass</label>&Tab;&Tab;

           <input type="radio" class="btn-check" name="btn[' . $checks['id'] . ']" id="btnwarning[' . $checks['id'] . ']" value="Warning">
           <label class="btn rounded-pill btn-outline-warning" for="btnwarning[' . $checks['id'] . ']">Warning</label>&Tab;&Tab;

           <input type="radio" class="btn-check" name="btn[' . $checks['id'] . ']" id="btnfail[' . $checks['id'] . ']" value="Fail">
           <label class="btn rounded-pill btn-outline-danger" for="btnfail[' . $checks['id'] . ']">Fail</label>&Tab;&Tab;

           <button onclick="myFunction('. $checks['id'] . ')" type="button" name="comment[' . $checks['id'] . ']" id="comment[' . $checks['id'] . ']" class="btn btn-info" style="float: right">Click</button> 
<br><br>
           <div style="display:none;" id="commentlinediv[' . $checks['id'] . ']">
           <input type="text" class="text-line" placeholder="Type Comment Here" id="commentline[' . $checks['id'] . ']"/>
</div>
</td>';
echo '<tr>';}?>

 </table>
<input type="button" name="submit" id="submit" class="btn btn-info" value="Submit" />
</div>
</form>
</div>
</div>

<style>
input[type="text"] {
   border:none; /* Get rid of the browser's styling */
   border-bottom:1px solid black; /* Add your own border */
}

.text-line {
   background-color: transparent;
   color: black;
   outline: none;
   outline-style: none;
   border-top: none;
   border-left: none;
   border-right: none;
   border-bottom: solid #eeeeee 1px;
   padding: 3px 10px;
   width: 300px;
}
                


</style>


<script>
function myFunction(var1) {
  
document.getElementById("commentlinediv[" + var1 + "]").style.display = "inline";
}

</script>

Exporting an auxiliar function outside the scope of a Adonis JS Controller class

I have an AdminController with a lot of backend API endpoints and there is an auxiliar function that one of the API depends upon. I need to call this auxiliar function from a Task File that runs every day in the morning. I tried exporting an object using module.exports = { AdminController, createReportAux } but that did not seem to work. How can I achieve this? Am I doing the import or export wrong?

class AdminController {

// backend API endpoint methods

    async deleteProgram({ request, params, response }) {
}

    async addProgram({ auth, request, response }) {
}

//I could call this but cannot pass auth information from the task file as it is not available there
    async createReport({ auth, params, response }) {
                        createReportAux(requestInfo, auth.user.email)
}

}


//function that I need to call which is outside AdminController class
const createReportAux = async (requestInfo, email) => {
}

module.exports = AdminController


const AdminController = use("App/Controllers/Http/AdminController")

class GetScheduledEmailForTheDay extends Task {
  static get schedule() {

  }
 await AdminController.createReportAux(requestInfo, individualEmailToSend.receiver_email)

}

Please suggest a solution, I have been stuck at it for a while. Exporting as an object seems to work but the API methods are not accessible that way.

How do i store data for HTML for file://

so I wanted to store a cookie for light mode and dark mode inside a html file in file://, NOT a webpage. file:// path, not a webpage

but then I learnt that cookies don’t actually work on file:// (or at least on chrome).
so I googled and learnt about local storage, but that too does not work….

so I wanted to know is there any other way of storing data even on a file:// path?

thank you

Slash commands not giving any response discord.js

I’ve been learning discord.js following the official docs, but I’m unable to get the bot to reply to the slash ( / ) commands

//This is the ping.js command file

const { SlashCommandBuilder } = require("discord.js");


module.exports = {
    data: new SlashCommandBuilder()
        .setName('pings')
        .setDescription('Replies with Pong!'),
    async execute(interaction) {
        await interaction.reply('Pong!');
    },
};

//This is the command handling / interaction handling


const foldersPath = path.join(__dirname, 'commands');
const commandFolders = fs.readdirSync(foldersPath);

for (const folder of commandFolders) {
    // Grab all the command files from the commands directory you created earlier
    const commandsPath = path.join(foldersPath, folder);
    const commandFiles = fs.readdirSync(commandsPath).filter(file => file.endsWith('.js'));
    // Grab the SlashCommandBuilder#toJSON() output of each command's data for deployment
    for (const file of commandFiles) {
        const filePath = path.join(commandsPath, file);
        const command = require(filePath);
        if ('data' in command && 'execute' in command) {
            commands.push(command.data.toJSON());
        } else {
            console.log(`[WARNING] The command at ${filePath} is missing a required "data" or "execute" property.`);
        }
    }
}


//construct and prepare an instance for the REST module
const rest = new REST().setToken(discordToken);

//deploy the commands
(async () =>{
    try{
        console.log(`Started refreshing ${commands.length} application (/) commands.`);

        const data = await rest.put(
            Routes.applicationGuildCommands(discordClientID),
            {body:commands},
        )

        console.log(`Successfully reloaded ${data.length} application (/) commands.`);
    } catch (err){
        console.error(err);
    }
})

client.on(Events.InteractionCreate, async interaction =>{
    if(!interaction.isChatInputCommand()) return;
    console.log(interaction);

    const command = interaction.client.commands.get(interaction.commandName);

    if (!command){
        console.error(`No command matching ${interaction.commandName} was found`);
        return;
    }

    try{
        await command.execute(interaction);
    } catch (err){
        console.error(err);
        if (interaction.replied || interaction.deferred){
            await interaction.followUp({content: 'There was an error while executing this command', ephemeral: true});
        }else{
            await interaction.reply({content: 'There was an error while executing this command', ephemeral: true});
        }
    }
});

Sorry if the code is long, but this is all I have. So far I know that whenever I type /pings the bot should response with “Pong!” but all I see is the slash commands of the other bots I have in the server. This is not comming from the app itself, since I have added the bot with this two scopes “bot” “application.commands” as well as the “slash commands” so I guess this should be working just fine…

I was trying to find a useful answer here, but all of them are outdated, and are no longer working.

Unknown resolution: Uncaught TypeError: Cannot read properties of null (reading ‘addEventListener’)

I tried moving the script tag to the end, this did not work. I also tried adding the script to the and adding defer before the source. Nothing seems to work, is there something I am missing. Here is my code:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="onclick.css" />
    <script defer src="onclick.js"></script>
  </head>
  <body>
    <div class="rotate">
      <div class="rotate-obj">Craft</div>
      <button class="rotate-btn">Spin it</button>
    </div>
  </body>
</html>

I tried moving the script to the head and adding defer as well as moving the script tag to the bottom right before the closing body tag. I’m expecting the button to rotate the text ‘Craft’ once the button is clicked. Nothing happens and I am getting an error (stated in the title above).

Reading data from Firestore database on Web app

I am so very lost on how to simply read records from Firestore.

I have a single collection called properties. In it, I have several documents all in the same form (all have name, and category). That’s it; no subcollections or anything complex.

I have set the rules as follows (many matches for testing):

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    allow read;
    
    match /{document=**} {
        allow read;
    }
  
    match /properties/{document=**} {
        allow read;
    }
    
    match /properties/{propertyid} {
        allow read;
    }
  }
}

Then, I have my web-based Expo app with the firebase npmjs package installed. I have initialized my Firebase app, and called getFirestore to grab a database instance and all called signInWithEmailAndPassword and signed in with a test account I set up in the Firebase console.

Finally, I want to grab all documents from the properties collection and display them on screen, so I wrote the following:

const query = collection(db, "properties");
const data = await getDocs(query);

I’ve also tried getting a specific property (I copied the ID from the Firebase console, so I know it exists):

const query = doc(db, "properties", "9sRm1TLWAIpYiZLfWPvo");
 const snapshot = await getDoc(query);

I am also doing the following:

  1. Printing out the user credentials that I called signInWithEmailAndPassword. I see a large object with my uid, accessToken, etc.
  2. Printing out my db variable (comes from this.db = getFirestore(this.app);). I see the correct information: firebase start options (apiKey, authDomain, projectId), my authentication credentials (current user uid matches what I see in the previous auth log, my auth object is filled out, etc. etc. (everything looks normal)

However, whatever the heck I try, I also get “Missing or insufficient permissions”.

I’ve also checked my rules with the “Rules Playground” on any document under /properties and get successful simulated reads, both unauthenticated and authenticated.

What am I doing wrong and how can I just get a list of all documents in that collection? That’s literally all I’m trying to do.

How to convert img to Image component in next.js

I have implemented all the logic in this component. But it is according to the tag. Now, I want same logic to implement in the Image component. But doing so, it is giving me error.

TypeError: Failed to construct 'Image': Please use the 'new' operator, this DOM object constructor cannot be called as a function.

Her is the code I changed “`import React, { useState, useRef, useEffect } from “react”;

const ImageUploadCard = () => {
const componentRef = useRef(null);
const [componentWidth, setComponentWidth] = useState(0);
const [componentHeight, setComponentHeight] = useState(0);

useEffect(() => {
// Function to update component width
function updateComponentWidth() {
if (componentRef.current) {
const width = componentRef.current.getBoundingClientRect().width;
const height = componentRef.current.getBoundingClientRect().height;

    console.log("Component width:", width);
    console.log("Component width:", height);
    setComponentWidth(width);
    setComponentHeight(height);
  }
}

// Update component width initially and add event listener for window resize
updateComponentWidth();
window.addEventListener("resize", updateComponentWidth);

// Clean up event listener on component unmount
return () => {
  window.removeEventListener("resize", updateComponentWidth);
};

}, []);

const inputRef = useRef(null);
const [previewImage, setPreviewImage] = useState(null);

const handleImageChange = (event) => {
const file = event.target.files[0];
if (file && file.size > 5242880) {
// File size exceeds the maximum limit
// You can display an error message or handle it as needed
console.log(“File size exceeds the maximum limit (5MB)”);

  return;
}
if (file) {
  const reader = new FileReader();
  reader.onloadend = () => {
    setPreviewImage(reader.result);
  };
  reader.readAsDataURL(file);
} else {
  setPreviewImage(null);
}

};

return (

<div
style={{ width: componentWidth }}
className=”dark:bg-jacarta-700 dark:border-jacarta-600 border-jacarta-100 group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white py-20 px-5 text-center”
onClick={() => inputRef.current.click()} // Click event triggers file input
>

Image formats: JPEG, PNG, JPG . Max size: 5 MB

<input
type=”file”
accept=”.jpg, .jpeg, .png”
onChange={handleImageChange}
style={{ display: “none” }} // Hide the input visually
ref={inputRef}
// Set a max file size of 5MB (in bytes)
// 5MB = 5 * 1024 * 1024 bytes
// Adjust this value as needed
max=”5242880″
/>

  {previewImage && (
    <div
      className="dark:bg-jacarta-700 dark:border-jacarta-600 border-jacarta-100 group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white py-20 px-5 text-center"
      style={{ width: componentWidth, height: 400 }} // Set width dynamically
    >
      <Image
        src={previewImage}
        alt="Preview"
        style={{ maxWidth: "100%", maxHeight: "100%", objectFit: "cover" }}
      />
    </div>
  )}
</div>

);
};

export default ImageUploadCard;

<img> tag which is working 

import React, { useState, useRef, useEffect } from “react”;

const ImageUploadCard = () => {
const componentRef = useRef(null);
const [componentWidth, setComponentWidth] = useState(0);
const [componentHeight, setComponentHeight] = useState(0);

useEffect(() => {
// Function to update component width
function updateComponentWidth() {
if (componentRef.current) {
const width = componentRef.current.getBoundingClientRect().width;
const height = componentRef.current.getBoundingClientRect().height;

    console.log("Component width:", width);
    console.log("Component width:", height);
    setComponentWidth(width);
    setComponentHeight(height);
  }
}

// Update component width initially and add event listener for window resize
updateComponentWidth();
window.addEventListener("resize", updateComponentWidth);

// Clean up event listener on component unmount
return () => {
  window.removeEventListener("resize", updateComponentWidth);
};

}, []);

const inputRef = useRef(null);
const [previewImage, setPreviewImage] = useState(null);

const handleImageChange = (event) => {
const file = event.target.files[0];
if (file && file.size > 5242880) {
// File size exceeds the maximum limit
// You can display an error message or handle it as needed
console.log(“File size exceeds the maximum limit (5MB)”);

  return;
}
if (file) {
  const reader = new FileReader();
  reader.onloadend = () => {
    setPreviewImage(reader.result);
  };
  reader.readAsDataURL(file);
} else {
  setPreviewImage(null);
}

};

return (

<div
style={{ width: componentWidth }}
className=”dark:bg-jacarta-700 dark:border-jacarta-600 border-jacarta-100 group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white py-20 px-5 text-center”
onClick={() => inputRef.current.click()} // Click event triggers file input
>

Image formats: JPEG, PNG, JPG . Max size: 5 MB

<input
type=”file”
accept=”.jpg, .jpeg, .png”
onChange={handleImageChange}
style={{ display: “none” }} // Hide the input visually
ref={inputRef}
// Set a max file size of 5MB (in bytes)
// 5MB = 5 * 1024 * 1024 bytes
// Adjust this value as needed
max=”5242880″
/>

  {previewImage && (
    <div
      className="dark:bg-jacarta-700 dark:border-jacarta-600 border-jacarta-100 group relative flex flex-col items-center justify-center rounded-lg border-2 border-dashed bg-white py-20 px-5 text-center"
      style={{ width: componentWidth, height: 400 }} // Set width dynamically
    >
      <img
        src={previewImage}
        alt="Preview"
        style={{ maxWidth: "100%", maxHeight: "100%", objectFit: "cover" }}
      />
    </div>
  )}
</div>

);
};

export default ImageUploadCard;


I want to change the <img> tag to Image component so, same logic been implemented. Not Image as a legacy one. But latest one. 

Error submitting form on Discord server using my discord bot

So now my data is being saved into database but the form on discord is not submiting it shows something went wrong on form but the form doesnt close but still i get the success message on my discord channel

here is the code link
code link

screen shot link
screen shot link

see behind form it says You have been successfully registered!

I tried to see the database if it actually saves the data inside the DB and yes it does but my form is not submiting it just says something wrong but shows registration successful

Send form and update button with Javascript

I have a page where users can vote a post or comment with an empty form. I have written JavaScript to submit the form and update the button with the vote count without refreshing the entire page. Instead of refreshing the button, the JavaScript routes to a new page with the JSON data returned from Flask.

post.html

<form class="d-inline" id="vote_form" action="{{ url_for('main.post', id=post.id) }}" method="post">           
    <input id="csrf_token" name="csrf_token" type="hidden" value="{{ csrf_token }}">
    <button class="px-1 py-0 btn btn-outline-dark btn-sm" id="vote_post_btn" type="submit" name="submit" value="vote_post">&#8679; 2</button>
</form>

<form class="d-inline" action="{{ url_for('main.post', id=comment.id) }}" method="post">                    
    <input id="csrf_token" name="csrf_token" type="hidden" value="{{ csrf_token }}">
    <button class="px-1 py-0 btn btn-outline-dark btn-sm" id="vote_comment_btn" type="submit" name="submit" value="vote_comment">&#8679; 0</button>
</form>

routes.py

@bp.route('/post/<int:id>', methods=['GET', 'POST'])
def post(id):
    post = db.first_or_404(sa.select(Post).where(Post.id == id))
    if request.method == 'POST':
        if request.form['submit'] == 'vote_post':
            vote = db.session.scalar(sa.select(PostVote).where((PostVote.user_id == current_user.id) & (PostVote.post_id == id)))
            post = db.session.scalar(sa.select(Post).where(Post.id == id))
            if vote is None:
                vote = PostVote(user_id=current_user.id, post_id=id)
                db.session.add(vote)
                db.session.commit()              
                return jsonify({"votes": post.votes_count(), "voted": True})
            else:
                db.session.delete(vote)
                db.session.commit()              
                return jsonify({"votes": post.votes_count(), "voted": False})
        if request.form['submit'] == 'vote_comment':
            vote = db.session.scalar(sa.select(CommentVote).where((CommentVote.user_id == current_user.id) & (CommentVote.comment_id == id)))
            comment = db.session.scalar(sa.select(Comment).where(Comment.id == id))
            if vote is None:
                vote = CommentVote(user_id=current_user.id, comment_id=id)
                db.session.add(vote)
                db.session.commit()
                return jsonify({"votes": comment.votes_count(), "voted": True})
            else:
                db.session.delete(vote)
                db.session.commit()
                return jsonify({"votes": comment.votes_count(), "voted": False})

javascript

        async function sendVote() {
            let form = document.getElementById("vote_form");            
            let formBtn = document.querySelectorAll("#vote_post_btn, #vote_comment_btn");
            let url = form.getAttribute("action");
                  // Associate the FormData object with the form element
                  const formData = new FormData(form);

                  try {
                    const response = await fetch(url, {
                      method: "POST",
                    })
                    .then((response) => response.json())
                    .then((data) => {
                        formBtn.innerHTML = data["votes"];
                        if (data["votes"] === true) {
                            formBtn.className = "px-1 py-0 btn btn-secondary btn-sm";
                        }
                        else {
                            formBtn.className = "px-1 py-0 btn btn-outline-dark btn-sm";
                        }
                    });
                    console.log(await response.json());
                  } catch (e) {
                    console.error(e);
                  }
        }
        //Take over form submission
        form.addEventListener("submit", (event) => {
          event.preventDefault();
          sendVote();
        });

page rendered

{
  "voted": true,
  "votes": 1
}

The JavaScript doesn’t update the button class and vote count. It renders JSON on a new page instead.
I used this MDN Advanced forms article and MDN json method to write the javascript.

Adjusting Website Viewport for Mobile and PC Users

So I’m normally using common viewport for PC users. As I basically learnt viewport codes for cross-compatibilities (i.e, webkit for Safari and Chrome browsers content rendering). However, I want the website to be accessible for every device and browsers.

Now, the questions are:

  1. Does this require .js file to make the website accessible to every single of device and browsers?
  2. What code would be used to make the task possible? (website accessible to every device and browsers)
  3. How do I make the website landscape-only for Android or iPhone users, thereby forcing users to rotate 90 degrees?
  4. (Optional) I would like to see your recommendation about the cross-compatibility toolkit to check the viewport on different browser and devices without having the website go online.

Thank you!

I only knew basic viewport such as device-width and initial-scale=”1.0″, and I tried to figure out by looking at the Q&A out there (and not sure how I should address the problem on Google).

Uncaught TypeError: addToMovieList is not a function

// MovieList.jsx
import "./movieList.scss";
import axios from "axios";
import { useEffect, useState } from "react";
import Card from "../card/Card";

function MovieList({ savedMovies, setSavedMovies }) {
  const [movieList, setMovieList] = useState(() => {
    const storedMovieList = JSON.parse(localStorage.getItem("movieList"));
    return storedMovieList || [];
  });

  useEffect(() => {
    if (!movieList.length) {
      fetchMovieList();
    }
  }, []); // Fetch movie list only on component mount if movieList is not available

  useEffect(() => {
    localStorage.setItem("movieList", JSON.stringify(movieList));
  }, [movieList]); // Update local storage whenever movieList changes

  const fetchMovieList = () => {
    axios
      .get(
        `https://api.themoviedb.org/3/discover/movie?api_key=${import.meta.env.VITE_API_KEY}`
      )
      .then((res) => {
        setMovieList(res.data.results);
      })
      .catch((err) => {
        console.log(err);
      });
  };


  const addToMovieList = (movieId) => {
    // Find the movie to add from savedMovies
    const movieToAdd = savedMovies.find(movie => movie.id === movieId);
    
    // Check if the movie to add exists
    if (movieToAdd) {
      // Update movieList state by adding the movie
      setMovieList(prevMovieList => [...prevMovieList, movieToAdd]);
    }
  };
  

  const removeFromMovieList = (movieId) => {
    setMovieList((prevMovieList) =>
      prevMovieList.filter((movie) => movie.id !== movieId)
    );
  };

  return (
    <div className="movieList">
      <Card
        movieList={movieList}
        savedMovies={savedMovies}
        setSavedMovies={setSavedMovies}
        removeFromMovieList={removeFromMovieList}
        addToMovieList={addToMovieList}
      />
    </div>
  );
}

export default MovieList;

// Card.jsx code
import { useState, useEffect } from "react";
import "./card.scss";

function Card({ movieList, savedMovies, setSavedMovies, source, removeFromMovieList, addToMovieList }) {
  const [saved, setSaved] = useState(null);
  
  const handleButtonClick = (movie) => {
    const isSaved = savedMovies.find((savedMovie) => savedMovie.id === movie.id);

    if (isSaved) {
      // If the movie is already saved, remove it
      const updatedSavedMovies = savedMovies.filter((savedMovie) => savedMovie.id !== movie.id);
      setSavedMovies(updatedSavedMovies);
      // Add the movie back to the movieList
      addToMovieList(movie.id); // Add the movie back to movieList
    } else {
      // If the movie is not saved, add it to savedMovies
      setSavedMovies((prevSavedMovies) => [...prevSavedMovies, movie]);
      // Remove the movie from the movieList
      removeFromMovieList(movie.id);
    }
    // Toggle the saved state of the movie
    setSaved((prevSaved) => (prevSaved === movie.id ? null : movie.id));
  };

  useEffect(() => {
    localStorage.setItem("savedMovies", JSON.stringify(savedMovies));
  }, [savedMovies]);

  return (
    <div className="cardContainer">
      {(source === "saved" ? savedMovies : movieList).map((movie) => (
        <div className="card" key={movie.id}>
          <div className="save">
            <button
              onClick={() => {
                handleButtonClick(movie);
              }}
              className={`button ${saved === movie.id ? "saved" : ""}`}
            >
              {saved === movie.id ? (
                <img src="/trash.png" alt="Remove from saved" />
              ) : (
                <img src="/star.png" alt="Add to saved" />
              )}
            </button>
          </div>
          <img
            src={`https://image.tmdb.org/t/p/w500${movie.poster_path}`}
            alt=""
          />
          <p>{movie.title}</p>
        </div>
      ))}
    </div>
  );
}

export default Card;

Please help me with this. I want to have my button add the selected movie back to the original movieList local storage. My local storage has the original movie list to display on one tab, and a savedMovies array to display on a different tab. I’m trying to call the addToMovieList function in the card component to add the movie back to my original movie list array when I click on the button, however I’m getting the TypeError. How come my removeFromMovieList works fine but not addToMovieList?

Switching between system, dark, and light mode

I am using MUI in my Next.js web app to switch between system, light, and dark mode. I am having it persist between sessions by saving the theme selected in local storage. I have placed the ability to change the theme of the web app within a dropdown in the settings modal, so changing of the theme occurs through a useContext. The issue I’m encountering is that theming is not persistent across all of my components if the theme the user selects is either the “system” theme (if your system them is dark mode), or “dark” theme. In addition, I also receive this error if my theme is not “light” theme on initial load or when switching from “light” theme to one of the others:

Warning: Prop `className` did not match. Server: "MuiButtonBase-root MuiIconButton-root MuiIconButton-colorInherit MuiIconButton-edgeStart MuiIconButton-sizeMedium css-134qg7o-MuiButtonBase-root-MuiIconButton-root" Client: "MuiButtonBase-root MuiIconButton-root MuiIconButton-colorInherit MuiIconButton-edgeStart MuiIconButton-sizeMedium css-6pxnsq-MuiButtonBase-root-MuiIconButton-root

After some searching, I originally thought it was because I had not been using CssBaseline within the ThemeProvider tags, however, after adding it, it appears to have only made things worse, and the error persists. I will show the different behavior in screenshots below:

Expected behavior if in “system” or “dark” mode (This is without CssBaseline between the ThemeProvider tags:
enter image description here

The actual behavior without CssBaseline on load in with “system” or “dark” mode:
enter image description here

The behavior on load when in “system” or “dark” mode with CssBaseline:
enter image description here

The behavior when switching from “light” mode to “system” or “dark” mode:
enter image description here

Listed below is my context code and how I’m getting the theme from the system, how I’m storing it in local storage, and how I’m switching it:

const ThemeContext = createContext()

const useThemeContext = () => useContext(ThemeContext)

export const ThemeModeProviderComponent = ({ children }) => {
  const systemTheme = typeof window !== 'undefined' && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'

  const [selectedTheme, setSelectedTheme] = useState(() =>
    typeof localStorage !== 'undefined' && localStorage.getItem('theme') || 'system'
  )

  const themes = {
    light: createTheme({
      palette: {
        mode: 'light',
        primary: {
          main: '#0065bd'
        },
        secondary: {
          main: '#00b6d3'
        }
      }
    }),
    dark: createTheme({
      palette: {
        mode: 'dark',
        primary: {
          main: '#0065bd'
        },
        secondary: {
          main: '#00b6d3'
        }
      }
    }),
    system: createTheme({
      palette: {
        mode: systemTheme,
        primary: {
          main: '#0065bd'
        },
        secondary: {
          main: '#00b6d3'
        }
      }
    })
  }

  useEffect(() => {
    if (selectedTheme === 'system') {
      const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
      themes.system.palette.mode = systemTheme
    }
  }, [selectedTheme, themes.system])

  const handleThemeChange = (event) => {
    const { value } = event.target

    setSelectedTheme(value)
    localStorage.setItem('theme', value)
  }

  return (
    <ThemeContext.Provider value={{ selectedTheme, handleThemeChange }}>
      <ThemeProvider theme={themes[selectedTheme]}>
          <CssBaseline enableColorScheme/>
          {children}
      </ThemeProvider>
    </ThemeContext.Provider>
  )
}

export const ThemeSelector = () => {
  const { selectedTheme, handleThemeChange } = useThemeContext()

  if (typeof window === 'undefined') return null

  return (
    <FormControl>
      <Select
        value={selectedTheme}
        onChange={handleThemeChange}
      >
        <MenuItem value='system'>System</MenuItem>
        <MenuItem value='dark'>Dark</MenuItem>
        <MenuItem value='light'>Light</MenuItem>
      </Select>
    </FormControl>
  )
}

Another possibility is that, because of the way I’m handling the showing and hiding of the drawer, it could be affecting the style. I basically copied the persistent drawer example from the MUI website here, but I don’t think it’s the case, as, as we’ve seen in the images, it it working properly to an extent.