Create a Java program that can generate a 14-character unique personal password [closed]

Create a Java program that can generate a 14-character unique personal password. The password combines the first two characters of the user’s nickname, the last four digits of their identification numbers, and their birthdate.

This program should include all these requirements:
i. This program should implement proper multiple inheritance with a minimum of THREE (4) classes
including Interface and main method class.
ii. A class constructor is used to accept all the inputs from the users.
iii. Abstract class which contains abstract methods and normal methods need to be used to process
all String manipulation to extract the password element from the user’s input data.
iv. An interface is used to display the final password combination.
v. Your program should apply a good programming style and documentation.

I tried but couldnt get anything

Displaying the Result of Your Nested Color Code

My project code is quite large and tedious, so I’ve written a shorter code to better explain my problem.

First, please review the following code:

  function chgrad() {
    // Get the selected radio button
    var selectedRadio = document.querySelector('input[name="radioGroup"]:checked');
  
    // Get colors and rotation values
    var red1 = document.getElementById('red1').value;
    var green1 = document.getElementById('green1').value;
    var blue1 = document.getElementById('blue1').value;
  
    var red2 = document.getElementById('red2').value;
    var green2 = document.getElementById('green2').value;
    var blue2 = document.getElementById('blue2').value;
  
    var rot = document.getElementById('rot').value;
  
    // Set background-size to cover before setting background-image
    document.getElementById('wrapper').style.backgroundSize = 'cover';
  
    // Create gradient string based on selected radio button
    var gradientString;
    if (selectedRadio.value === 'option1') {
      gradientString = "-webkit-linear-gradient(" + rot + "deg, rgb(" + red1 + "," + green1 + "," + blue1 + "))";
    } else if (selectedRadio.value === 'option2') {
      gradientString = "-webkit-linear-gradient(" + rot + "deg, rgb(" + red1 + "," + green1 + "," + blue1 + "), rgb(" + red2 + "," + green2 + "," + blue2 + "))";
    }
  
    // Apply the gradient
    document.getElementById('wrapper').style.backgroundImage = gradientString;
  }
 .wrapper {
    width: 100%;
    height: 50px;
    background-color: #000;
    background-image: transparent;
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<div id="wrapper" class="wrapper"></div>

    <div class="btn-radio">
        <input type="radio" id="radio1" name="radioGroup" value="option1" checked>
        <label for="radio1">One colors</label>
    </div>

    <div class="btn-radio">
        <input type="radio" id="radio2" name="radioGroup" value="option2">
        <label for="radio2">Two colors</label>
    </div>

    <div class="rotate-change-main">
        <label for="rot">Rotate</label>
        <input type="range" min="0" max="360" oninput="chgrad()" value="0" id="rot">
    </div>

    <br>

    <div id="range_color1" class="range-color">
        <label for="red1">Red</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="red1" value="0" /><br />
        <label for="green1">Green</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="green1" value="0" /><br />
        <label for="blue1">Blue</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="blue1" value="0" /><br />
    </div>

    <br>

    <div id="range_color2" class="range-color">
        <label for="red2">Red</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="red2" value="0" /><br />
        <label for="green2">Green</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="green2" value="0" /><br />
        <label for="blue2">Blue</label>
        <input type="range" min="0" max="255" oninput="chgrad();" id="blue2" value="0" /><br />
    </div>

Problem:

As you can see in the code above, when the first button (One colors) with the ID #radio1 is active, changing the values in the #range_color1 box does not cause any changes in the black box. However, as soon as the second button (Two colors) with the ID #radio2 is activated, a combined color is correctly created.

My question:

My problem is exactly here!

I want the changes to be reflected in the black box in full width (so that there is only one color) when the first button (One colors) with the ID #radio1 is active, and the color to be combined (gradient) when the second button (Two colors) with the ID #radio2 is activated In the black box, a color should be displayed as a combination (gradient).

Additional Information:

I have already tried setting the background-image property to none in the CSS for the .wrapper class. I have also tried creating a separate gradient string for each option, but this does not work either.

I would appreciate it if you could help me solve this problem.

Thank you for your time and assistance.

“Is each frontend index uniquely mapped to a payroll ID, and is PaySlipPDF processing data for every index?”please ready my description give solution

import AppSelect from '@/components/form-fields/AppSelect';
import {
  Box,
  Button,
  CircularProgress,
  Divider,
  List,
  ListItemButton,
  ListItemIcon,
  ListItemText,
  Stack,
  Typography,
  useTheme,
} from '@mui/material';
import React, { useEffect } from 'react';
import { BlobProvider, PDFDownloadLink } from '@react-pdf/renderer';
import Iconify from '@/components/iconify';
import PaySlipPDF from './paySlipPDF';
import useGet from '@/hooks/useGet';
import { useForm } from 'react-hook-form';
import { useParams } from 'react-router-dom';
import { PAYSTRUCTURE_PAYROLL_LIST_ENDPOINT } from '@/constants/my-company/employee-directory';
import useUserStore from '@/store/user.store';

type PayRoll = {
  year: string;
  month: string;
  monthText: string;
  payrollId: string;
};

const Payslips = () => {
  const theme = useTheme();
  const [selectedIndex, setSelectedIndex] = React.useState(1);
  const [payrollId, setPayrollId] = React.useState('');
  const [list, setlist] = React.useState<PayRoll[] | undefined>([]);
  const { control, watch } = useForm();
  const user = useUserStore((state) => state.user);
  // const {id} = useParams();
  const { data } = useGet<any>(
    PAYSTRUCTURE_PAYROLL_LIST_ENDPOINT (user?.Employee?.id), ['getPayrunListForEmp']
  );

  
  // const options = [...new Set(data?.map((each: { year: any; }) => each.year))].map((each) => ({
  //   label: each,
  //   value: each,
  // }));


  // const year = watch('year');
  // useEffect(() => {
  //   if (data) {
  //     setlist(data?.filter((each: { year: any; }) => each.year === year));
  //   }
  // }, [year, data]);
  
  const options = [...new Set(data?.map((each:any) => each.year))].map((each) => ({
    label: each,
    value: each,
  }));

  const year = watch('year');
  useEffect(() => {
    setlist(data?.filter((each:any) => each.year == year));
  }, [year, data, payrollId]);
  const handleListItemClick = (index: number, id: string) => {
    setSelectedIndex(index);
    if (payrollId !== id) {
      setPayrollId(id);
    } else {
      // Reset payrollId if the same month is selected again
      setPayrollId('');
    }
  };
  
  // Add your custom styles for the header box
  const headerStyles = {
    display: 'flex',
    flexDirection: 'row',
    width: '70%',
    justifyContent: 'space-between',
    alignItems: 'center',
    padding: theme.spacing(2),
    backgroundColor: '#4A5363',
    color: theme.palette.primary.contrastText,
  };
  // console.log('Data:', data);
  // console.log('Options:', options);
  // console.log('List:', list);
  // console.log('Mapped Years:', data?.map((each: { year: any; }) => each.year));
  return (
    <Stack
      sx={{
        display: 'flex',
        flexDirection: 'row',
        margin: 2,
        gap: 2,
        flexWrap: 'wrap',
        height: '100%',

        [theme.breakpoints.down('sm')]: {
          flexDirection: 'column',
        },
      }}
    >
      <Stack
        direction='column'
        sx={{
          width: '250px',
          [theme.breakpoints.down('sm')]: {
            width: '100%',
          },
        }}
        gap={2}
      >
        <AppSelect control={control} name='year' options={options} />
        <Box component='span' sx={{ bgcolor: 'background.paper', flex: 1 }}>
          <List component='nav' aria-label='main mailbox folders'>
            {list?.map((each, idx) => (
              <ListItemButton
                selected={selectedIndex === idx}
                onClick={(event) => handleListItemClick(idx, each.payrollId)}
              >
                <ListItemText primary={each.monthText} />
              </ListItemButton>
            ))}
          </List>
        </Box>
      </Stack>
      <Box sx={{ flex: 1 }}>
        {payrollId ? (
          <PaySlipPDF id={payrollId} />
        ) : (
          <Typography variant='body2'>Select Year and Month </Typography>
        )}
      </Box>
    </Stack>
  );
};

export default Payslips;

in this provided code if i select month which is in listitembutton it fetch data and gives payslipdf, but after selecting next month for three time then only it shows next payslip pdf for that month for example if i select jan it shows payslip pdf and same time if i press feb for three times then only it shows the payslip pdf

 useEffect(() => {
    setlist(data?.filter((each:any) => each.year == year));
  }, [year, data, payrollId]);
  const handleListItemClick = (index: number, id: string) => {
    setSelectedIndex(index);
    if (payrollId !== id) {
      setPayrollId(id);
    } else {
      // Reset payrollId if the same month is selected again
      setPayrollId('');
    }
  };
type here
import { PAYSTRUCTURE_PAYSLIP_ENDPOINT } from "@/constants/my-company/employee-directory"
import useGet from "@/hooks/useGet"
import { LinearProgress } from "@mui/material"
import { useEffect, useRef } from "react"

export default function PaySlipPDF({id}:{id:string}) {
    const { data,isLoading } = useGet<any>(PAYSTRUCTURE_PAYSLIP_ENDPOINT + `/${id}`, ["payslip"],false,true)
    const ref = useRef<any>()
    useEffect(() => {
        console.log(data)
        const file = new Blob([data], 
            { type: 'application/pdf' });
        //Build a URL from the file
        const fileURL = URL.createObjectURL(file);
        console.log(fileURL)
        ref.current.src = fileURL
//Open the URL on new Window
// window.open(fileURL);
    }, [data])
    
    return (
        <div style={{ width: "100%", height: "700px" }}>
            {isLoading && <LinearProgress />}
             <iframe style={{display:isLoading?"none":"block"}} width="100%" height="100%" ref={ref} />
      </div>
   
  )
}

i modify the logic but it won’t works please give some solution it in react tyepscript

I’m facing an error while loading a script in my React app’s public HTML file, but the script works fine in the background. How can I resolve this?

How to specify the column and data property in jspreadsheet ce when a property is another object

The outer object has properties name, id, age, and company. The company property is another object with properties name and location.

var table = jexcel(document.getElementById('spreadsheet'), {        
data:[
    { name:'Jorge', id:'3', age:'40',company:{name:'nokia',location:'us'} },
    { name:'Robert', id:'4', age:'48',company:{name:'nokia',location:'us'} },
    { name:'Santos', id:'5', age:'32',company:{name:'nokia',location:'us'} },
],
columns: [
    { type:'text', width:300, name:'id', title:'id' },
    { type:'text', width:100, name:'name', title:'name' },
    { type:'text', width:100, name:'age', title:'age' },
    { type:'text', width:100, data:'company.name', title:'company name' },
    { type:'text', width:100, data:'company.location', title:'company location' },
 ]
});

and the result table looks like this:
enter image description here

An example of this issue here: https://jsfiddle.net/sridharnetha/vf0tknxb/2/

my question is that i will added a polyline in D3 pie chart

My problem is that my polylines in my chart are not correct positioning on the exact data on my slices which are given in my code

This is my code of slices and polylines when yu convert this code into html this will run and place on W3 school or place this code on a function and call on html on click

for reference the whole code
https://observablehq.com/@mast4461/d3-donut-chart-labels
this is a donut but exact polylines will place on their correct positioning and my chart is pie chart in 3D-view i will attach my UI in image

    var slices = vis
      .append("svg:g")
      .attr("transform", "translate(" + x + "," + y + ")")
      .attr("class", "slice");

    slices
      .selectAll(".innerSlice")
      .data(_data)
      .enter()
      .append("path")
      .attr("class", "innerSlice")
      .style("fill", function (d) {
        return d3.hsl(d.data.color).darker(0.7);
      })
      .attr("d", function (d) {
        return pieInner(d, rx + 0.5, ry + 0.5, h, ir);
      })
      .each(function (d) {
        this._current = d;
      });

    slices
      .selectAll(".topSlice")
      .data(_data)
      .enter()
      .append("path")
      .attr("class", "topSlice")
      .style("fill", function (d) {
        return d.data.color;
      })
      .style("stroke", function (d) {
        return d.data.color;
      })
      .attr("d", function (d) {
        return pieTop(d, rx, ry, ir);
      })
      .each(function (d) {
        this._current = d;
      });

    slices
      .selectAll(".outerSlice")
      .data(_data)
      .enter()
      .append("path")
      .attr("class", "outerSlice")
      .style("fill", function (d) {
        return d3.hsl(d.data.color).darker(0.7);
      })
      .attr("d", function (d) {
        return pieOuter(d, rx - 0.5, ry - 0.5, 40, 5, 50, 100, 0.02);
      })
      .each(function (d) {
        this._current = d;
      });

    slices
      .selectAll(".percent")
      .data(_data)
      .enter()
      .append("text")
      .attr("class", "percent")
      .attr("x", function (d) {
        return 0.6 * rx * Math.cos(0.5 * (d.startAngle + d.endAngle));
      })
      .attr("y", function (d) {
        return 0.6 * ry * Math.sin(0.5 * (d.startAngle + d.endAngle));
      })
      .text(getPercent)
      .each(function (d) {
        this._current = d;
      });

    function pieInner(d, rx, ry, h, ir) {
      var startAngle = d.startAngle < Math.PI ? Math.PI : d.startAngle;
      var endAngle = d.endAngle < Math.PI ? Math.PI : d.endAngle;

      var sx = ir * rx * Math.cos(startAngle),
        sy = ir * ry * Math.sin(startAngle),
        ex = ir * rx * Math.cos(endAngle),
        ey = ir * ry * Math.sin(endAngle);

      var ret = [];
      ret.push(
        "M",
        sx,
        sy,
        "A",
        ir * rx,
        ir * ry,
        "0 0 1",
        ex,
        ey,
        "L",
        ex,
        h + ey,
        "A",
        ir * rx,
        ir * ry,
        "0 0 0",
        sx,
        h + sy,
        "z"
      );
      return ret.join(" ");
    }

    function pieTop(d, rx, ry, ir) {
      if (d.endAngle - d.startAngle == 0) return "M 0 0";
      var sx = rx * Math.cos(d.startAngle),
        sy = ry * Math.sin(d.startAngle),
        ex = rx * Math.cos(d.endAngle),
        ey = ry * Math.sin(d.endAngle);

      var ret = [];
      ret.push(
        "M",
        sx,
        sy,
        "A",
        rx,
        ry,
        "0",
        d.endAngle - d.startAngle > Math.PI ? 1 : 0,
        "1",
        ex,
        ey,
        "L",
        ir * ex,
        ir * ey
      );
      ret.push(
        "A",
        ir * rx,
        ir * ry,
        "0",
        d.endAngle - d.startAngle > Math.PI ? 1 : 0,
        "0",
        ir * sx,
        ir * sy,
        "z"
      );
      return ret.join(" ");
    }

    function pieOuter(d, rx, ry, h) {
      var startAngle = d.startAngle > Math.PI ? Math.PI : d.startAngle;
      var endAngle = d.endAngle > Math.PI ? Math.PI : d.endAngle;

      var sx = rx * Math.cos(startAngle),
        sy = ry * Math.sin(startAngle),
        ex = rx * Math.cos(endAngle),
        ey = ry * Math.sin(endAngle);

      var ret = [];
      ret.push(
        "M",
        sx,
        h + sy,
        "A",
        rx,
        ry,
        "0 0 1",
        ex,
        h + ey,
        "L",
        ex,
        ey,
        "A",
        rx,
        ry,
        "0 0 0",
        sx,
        sy,
        "z"
      );
      return ret.join(" ");
    }
    var radius = 200;
    var arc = d3
      .arc()
      .innerRadius(radius - 100)
      .outerRadius(radius - 50);

    var outerArc = d3
      .arc()
      .innerRadius(radius * 0.9)
      .outerRadius(radius * 0.9);
    // Add the polylines between chart and labels:
    slices
      .selectAll("allPolylines")
      .data(_data)
      .enter()
      .append("polyline")
      .attr("stroke", "black")
      .style("fill", "none")
      .attr("stroke-width", 1)
      .attr("points", function (d) {
        console.log("checkkkshdfkh", d);
      
        var posA = arc.centroid(d) // line insertion in the slice
        var posB = outerArc.centroid(d) // line break: we use the other arc generator that has been built only for that
        var posC = outerArc.centroid(d); // Label position = almost the same as posB
        let tempX= 0.6 * rx * Math.cos(0.5 * (d.startAngle + d.endAngle));
        let tempY= 0.6 * ry * Math.sin(0.5 * (d.startAngle + d.endAngle))
        var midangle = d.startAngle + (d.endAngle - d.startAngle) / 2 // we need the angle to see if the X position will be at the extreme right or extreme left
        posC[0] = radius * 0.95 * (midangle < Math.PI ? 1 : -1);
        console.log("checknskdnfknsdf",posA,[tempX,tempY])
        return [posA, posB, posC]

      });

My UI looks like

I try https://observablehq.com/@mast4461/d3-donut-chart-labels and i try most of the code but it didn’t work

I expect that my polylines are place on the exact slice based on the data and also

Copy of my webpage with a single statement causing an error

I am making a website with the flask module of python and facing issue in javascript of my html element and the error is in a on click event, when I click the button it shows an uncaught ReferenceError in console and it refers to copy of my webpage containing only a single onclick event statement and refering to the parameter I passed as undefined.

function add_card(id1, l_no){
                            var sec = document.getElementById(id1);


                    var inp1 = document.createElement("input");
                    inp1.setAttribute("placeholder","Enter a title");
                    inp1.setAttribute("id","inp1");
                    inp1.setAttribute("type","text");

                    var btn1 = document.createElement("button");
                    btn1.textContent = "Add card";
                    btn1.setAttribute("id","c_btn");
                    btn1.setAttribute("type","button");
                    btn1.setAttribute("onclick","card_done(l_no)");

                    sec.insertBefore(inp1,sec.lastElementChild);
                    sec.insertBefore(btn1,sec.lastElementChild);

                }```

resulting error in console:
Uncaught ReferenceError: l_no is not defined
    at HTMLButtonElement.onclick (1:1:11)

creating a copy file like this
[enter image description here](https://i.sstatic.net/KKRYg7Gy.png)


i checked the variable by printing it, there is no issue with the variable "l_no".
Please help finding the issue. 

Specific Part Not Showing in PieChart

I have a pie chart displaying various amounts and values. However, I’ve encountered an issue where a specific segment is not appearing on the chart. I’m seeking assistance to resolve this matter. I’ve ensured that I’m fetching all values correctly, and upon inspecting them through console.log, everything appears to be working fine. Could AnyOne please help me understand why this discrepancy is occurring?

I’ve attached an image where you can observe that I’ve retrieved the amount for ‘1link,’ yet the corresponding segment is not visible on the chart.

here is the code


            ////////////////////////maintenance

            var graphtotmanamontValue = '<%= graphtotmanamont.Text %>';
            var graphtotmanamont1lnkValue = '<%= graphtotmanamont1lnk.Text %>';
            var graphtotmanamontkpayValue = '<%= graphtotmanamontkpay.Text %>';
            var graphtotmanamontothrValue = '<%= graphtotmanamontothr.Text %>';

            var outstndngmanamnt = '<%= lbltotaloutstandingamountman.Text%>';
            var splitoutstndngmanamnt = outstndngmanamnt.split(',');
            var splittedoutstndngmanamnt = splitoutstndngmanamnt.join('');


            ////percentage
            var totalmainothramountpercentage = (graphtotmanamontothrValue / graphtotmanamontValue * 100).toFixed(2) + "%";
            var totalmain1linkamountpercentage = (graphtotmanamont1lnkValue / graphtotmanamontValue * 100).toFixed(2) + "%";
            var outstndngmainprcntg = (splittedoutstndngmanamnt / graphtotmanamontValue * 100).toFixed(2) + "%";


            var Mainchart = new CanvasJS.Chart("MaintenanceChart", {
                animationEnabled: true,
                backgroundColor: "transparent",
                data: [{
                    type: "pie",
                    startAngle: 240,
                    yValueFormatString: "##0""",
                    indexLabel: "{label} {y}",
                    dataPoints: [
                        { y: parseFloat(splittedoutstndngmanamnt), label: "O/S ", toolTipContent: "Outstanding Receieved : " + outstndngmainprcntg },
                        { y: parseFloat(graphtotmanamontkpayValue), label: " KPay" },
                        { y: parseFloat(graphtotmanamontothrValue), label: " Others", toolTipContent: "Others Receieved : " + totalmainothramountpercentage , color:"#FFC0CB" },
                        { y: parseFloat(graphtotmanamont1lnkValue), label: " 1LINK", toolTipContent: "1 link Receieved : " + totalmain1linkamountpercentage, color: "orange" }
                    ]
                }]
            });

            Mainchart.render();

Converting an SVG path arc to DXF

I am working on creating a custom converter from svg to dxf and need a math wizard to help me figure out where my logic is flawed.

Here is my current code:

function svgArcToLWPolyline(rx, ry, rotation, largeArcFlag, sweepFlag, x1, y1, x2, y2) {
    const scaleX = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / (2 * rx);
    const scaleY = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) / (2 * ry);

    const arcInfo = svgArcToOvalArc(rx * scaleX, ry * scaleY, rotation, largeArcFlag, sweepFlag, x1, y1, x2, y2);
    const numPoints = calculateNumberOfPoints(rx * scaleX, ry * scaleY, arcInfo.startAngle, arcInfo.endAngle);

    // Calculate bulge factors
    const bulgeFactors = [];
    const angleIncrement = (arcInfo.endAngle - arcInfo.startAngle) / (numPoints - 1);
    let currentAngle = arcInfo.startAngle;
    for (let i = 0; i < numPoints - 1; i++) {
        const nextAngle = currentAngle + angleIncrement;
        const bulge = Math.tan((nextAngle - currentAngle) * Math.PI / 360);
        bulgeFactors.push(bulge);
        currentAngle = nextAngle;
    }
    bulgeFactors.push(0); // Last point has zero bulge

    // Construct LWPOLYLINE points
    const lwpolylinePoints = [];
    for (let i = 0; i < numPoints; i++) {
        const angle = arcInfo.startAngle + i * angleIncrement;
        const x = arcInfo.cx + rx * scaleX * Math.cos(angle * Math.PI / 180);
        const y = arcInfo.cy + ry * scaleY * Math.sin(angle * Math.PI / 180);
        lwpolylinePoints.push([x, y, bulgeFactors[i]]);
    }

    return lwpolylinePoints;
}

function svgArcToOvalArc(rx, ry, rotation, largeArcFlag, sweepFlag, x1, y1, x2, y2) {
    // Convert rotation angle to radians
    const angle = rotation * Math.PI / 180;

    // Calculate intermediate values
    const dx = (x1 - x2) / 2;
    const dy = (y1 - y2) / 2;
    const x1p = Math.cos(angle) * dx + Math.sin(angle) * dy;
    const y1p = -Math.sin(angle) * dx + Math.cos(angle) * dy;
    const rxSq = rx * rx;
    const rySq = ry * ry;
    const x1pSq = x1p * x1p;
    const y1pSq = y1p * y1p;
    let radicand = (rxSq * rySq - rxSq * y1pSq - rySq * x1pSq) / (rxSq * y1pSq + rySq * x1pSq);

    // Ensure non-negative radicand
    if (radicand < 0) {
        radicand = 0;
    }

    // Calculate root
    let root = Math.sqrt(radicand);
    if (largeArcFlag === sweepFlag) {
        root = -root;
    }
    const cxp = root * rx * y1p / ry;
    const cyp = -root * ry * x1p / rx;

    // Calculate center
    const cx = Math.cos(angle) * cxp - Math.sin(angle) * cyp + (x1 + x2) / 2;
    const cy = Math.sin(angle) * cxp + Math.cos(angle) * cyp + (y1 + y2) / 2;

    // Calculate start and end angles
    let startAngle = Math.atan2((y1p - cyp) / ry, (x1p - cxp) / rx);
    let endAngle = Math.atan2((-y1p - cyp) / ry, (-x1p - cxp) / rx);

    // Convert angles to degrees
    startAngle *= 180 / Math.PI;
    endAngle *= 180 / Math.PI;

    // Adjust angles to be in the range [0, 360]
    if (startAngle < 0) {
        startAngle += 360;
    }
    if (endAngle < 0) {
        endAngle += 360;
    }

    return { cx: cx, cy: cy, startAngle: startAngle, endAngle: endAngle };
}

function calculateNumberOfPoints(rx, ry, startAngle, endAngle) {
    // Calculate arc length
    let arcLength;
    if (startAngle <= endAngle) {
        arcLength = (endAngle - startAngle) * Math.PI / 180;
    } else {
        arcLength = (360 - startAngle + endAngle) * Math.PI / 180;
    }
    arcLength *= (rx + ry) / 2;

    // Choose a fixed length for each segment
    const segmentLength = 1.0;  // Adjust as needed

    // Calculate the number of points
    const numPoints = Math.max(Math.floor(arcLength / segmentLength), 2);  // Minimum of 2 points

    return numPoints;
}

Here is what the svg looks like using d=”M10,10L20,25A1,3,0,0,0,50,50L90,90V80Z”
enter image description here
And here is my dxf (don’t worry that it’s upside down
enter image description here

As you can see, the ry and rx aren’t being taken into account. And when I change my path to add a xRotationalAxis, my dxf breaks even more: d=”M10,10L20,25A1,3,45,0,0,50,50L90,90V80Z”:
SVG:
enter image description here
DXF:
enter image description here

I’ve spent 12 hours trying to tweek this and figure out mathmatically how to make it work (with a lot of help from ChatGPT) So any help I can get on this would be really nice!

‘http://localhost:3000’ has been blocked by CORS

I’ve been trying to connect my react .js file to the back end. I have a API in API Gateway and I created a method and enabled CORS and gave it access

method.response.header.Access-Control-Allow-Headers 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'
method.response.header.Access-Control-Allow-Methods 'OPTIONS'
method.response.header.Access-Control-Allow-Origin  '*'

I even tried the http://localhost:3000 for the Access-Control-Allow-Origin

but every-time I run this code and check the console I’m getting the error

Access to fetch at https://mdksmdk.execute-api.us-east-5.amazonaws.com/blehxajkhnd from origin http://localhost:3000 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. If an opaque response serves your needs, set the request’s mode to ‘no-cors’ to fetch the resource with CORS disabled.

I’ve enabled the CORS multiple times. Idk what could be the issue

I can paste the code if that helps

Is there a way to store users first login time in react js application with react-oidc-context

I am using OIDC for authentication in my react application. For that i am using react-oidc-context library. There was some use case in our application that user first time login time i want to store in my application so i can compare his login time with current time and will logout user once 8hrs completed. I know token expiry also do the job but token we are renewing every 30minutes just i want to check if the user has been logged in for more than 8 hours he should get logged out.

I am trying to store login time in localstorage when user is authenticated by auth.isAuthenticated but the problem is if i refresh the tab then the new login time is get added to the locasotrage.

validation to avoid overlapping of text not working inside squares

Following steps need to be followed in order for the code to work.

  1. Select one option from Select options dropdown.
  2. Select a color from the dropdown.
  3. Click Show Options button
  4. Enter a row and column (For example A and 1) and then click calculate
  5. Hit the Move Text Content! button to move blue boxes on the grid.
    Forget about barcode and plate name for this problem.

Scenario I’m trying to validate:

Let’s say I have option one related content on cell A1, A2 and A3 and option two related content starting from B1.

Note: the order in which the cell contents are filling are left to right and from bottom to up. Hence, when I hit the Move Text Content button to fill 7 blue boxes on the grid starting from B1, it will look like this.
enter image description here

As you can see, the last two items OptionTwo#6 and OptionTwo#7 got overlapped with already present text on A1 and A2. So I’m trying to handle this edge case scenario and I was approaching it this way (code snippet below from the actual code):

myButton.addEventListener("click", () => {
        /* To Validate:
        Case #1: If the cell value for starting square already exists
        then, you cannot fill it. Show an alert. 
        
        Case #2: Check for all the values that are about to be moved on to
        the squares. If any of these overlap with already existing value of the grid
        then you cannot fill it. Show an alert
        */

        /* Get all values that need to be tested 
       */

        var childDivs = document
            .getElementById("phrase")
            .querySelectorAll("div:has(> span[data-id])");

        console.log(childDivs);

        // get the calculated value of the cell number
        let testValue = document.querySelector("#cellnum").innerHTML;

        console.log("Test Value");
        console.log(testValue);
        let integerValue = parseInt(testValue);

        // create an array of values to be tested.
        const valueArray = [];
        for (i = 0; i < childDivs.length; i++) {
            valueArray.push(integerValue + i);
        }



        for (j = 0; j < valueArray.length; j++) {
            var getDivWithValue = document
                .getElementById("drop-em")
                .querySelectorAll('div:has(> span[data-id="' + valueArray[j] + '"])');



            if (getDivWithValue.length > 0) {
                console.log("A value already exists for cell value " + valueArray[j]);

                alert("Starting Square or other Square needed to complete the move are already in use.Please use different Starting Cell Value");
                return;
            }
        }


        fill();
    },

    );

What’s the issue with the above approach?

Here is my complete working code:

/*

Requires jquery + UI

https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js

https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js

*/

$('[name="optionSelection"]').change(function () {
      //clean up the divs inside div with id phrase
    $("#phrase").empty();
  });
let selectedColor;
  function showOptions() {
      selectedColor = $('#lineupColors').val();
    var html;
    if ($("#optionSelection").val() == 1) {
      for (i = 0; i < 3; i++) {
         
            html = "<div data-id="+i+"><span class='words' style='color:black;background-color:white'  data-id="+i+">OptionOne#"+i+"</span></div>";
            $("#phrase").append(html);
      }
      
    }
    else {
      for (j = 0; j < 8; j++) {
         
        html = "<div data-id="+j+"><span class='words'  style='color:black;background-color:white' data-id="+j+">OptionTwo#"+j+"</span></div>";
       $("#phrase").append(html);
    }
   // $("#phrase").append(html);
  }
}


  $(".words").draggable({
    revert: function (event, ui) {
      var bRevertingPhrase = this.closest("#drop-em");

      if (!bRevertingPhrase.length) {
        var phraseID = $(this).data("id");
        var phraseHomeID = $(this).parent().data("id");

        //If the child and parent ids don't match, we move the child to the correct parent
        if (phraseID !== phraseHomeID) {
          var correctCell = $("#phrase").find(
            "div[data-id='" + phraseID + "']"
          );
          correctCell.prepend(this);
        }
      }
      return !event;
    },
  });
  $("#drop-em > div").droppable({
    drop: function (ev, ui) {
      $(ui.draggable)
        .detach()
        .css({ top: 0, left: 0 })
        .appendTo($(this).find(".content:empty"));
      //$("#move-text").addClass("disabled");
    },
  });
  $("#phrase > div").droppable({
    drop: function (ev, ui) {
      $(ui.draggable).detach().css({ top: 0, left: 0 }).prependTo(this);
    },
  });

  const myButton = document.querySelector("#move-text");
  myButton.addEventListener("click", () => {
        /* To Validate:
        Case #1: If the cell value for starting square already exists
        then, you cannot fill it
        
        Case #2: Check for all the values that are about to be moved on to
        the squares. If anyone of these overlap with already existing value of the grid
        then you cannot fill it
        */

        /* Get all values that needs to be tested 
       */

        var childDivs = document
            .getElementById("phrase")
            .querySelectorAll("div:has(> span[data-id])");

        console.log(childDivs);

        // get the calculated value of the cell number
        let testValue = document.querySelector("#cellnum").innerHTML;

        console.log("Test Value");
        console.log(testValue);
        let integerValue = parseInt(testValue);

        // create an array of values to be tested.
        const valueArray = [];
        for (i = 0; i < childDivs.length; i++) {
            valueArray.push(integerValue + i);
        }



        for (j = 0; j < valueArray.length; j++) {
            var getDivWithValue = document
                .getElementById("drop-em")
                .querySelectorAll('div:has(> span[data-id="' + valueArray[j] + '"])');



            if (getDivWithValue.length > 0) {
                console.log("A value already exists for cell value " + valueArray[j]);

                alert("Starting Square or other Square needed to complete the move are already in use.Please use different Starting Cell Value");
                return;
            }
        }


        fill();
    },

    );

  var reOrder = [];
  function fill() {
    const cells = document.querySelectorAll("#phrase > div > span");
    var newLoc = "";
    //myButton.classList.add("disabled");

    cells.forEach((cell, index) => {
      newLoc = document.querySelector(
        ".item:nth-child(" + reOrder[index + startPos - 1] + ") .content "
      );
      newLoc.append(cell);
      newLoc.classList.add("moved");
       newLoc.classList.add("color-"+selectedColor);
      $('.color-'+selectedColor).css('background-color',selectedColor);
      
    });
  }
  function reArrange() {
    var limit1 = 85;
    var limit2 = 91;

    for (let loop = 0; loop < 8; loop++) {
      for (let i = 0; i < 6; i++) {
        reOrder.push(limit1 + i);
      }
      limit1 = limit1 - 12;
    }
    for (let loop = 0; loop < 8; loop++) {
      for (let j = 0; j < 6; j++) {
        reOrder.push(limit2 + j);
      }
      limit2 = limit2 - 12;
    }
  }
  reArrange();

  /* get cell number */

  const myRow = document.querySelector("#inp1");
  const myCol = document.querySelector("#inp2");
  var startPos = 0;
  const myCalculateButton = document.querySelector("#calculate");
  const myAnswer = document.querySelector("#cellnum");
  myCalculateButton.addEventListener("click", () => {
    var rowNumber = myRow.value.toUpperCase();
    var colNumber = myCol.value;
    var result = 0;
    switch (rowNumber) {
      case "A":
        rowNumber = 42;
        break;
      case "B":
        rowNumber = 36;
        break;
      case "C":
        rowNumber = 30;
        break;
      case "D":
        rowNumber = 24;
        break;
      case "E":
        rowNumber = 18;
        break;
      case "F":
        rowNumber = 12;
        break;
      case "G":
        rowNumber = 6;
        break;
      case "H":
        rowNumber = 0;
        break;
    }

    if (colNumber < 7) {
      result = rowNumber + parseInt(colNumber);
    } else {
      result = rowNumber + 42 + parseInt(colNumber);
    }
    myAnswer.innerHTML = result;
    startPos = result;
  });
  
 
html {
    box-sizing: border-box;
  }
  *,
  *:before,
  *:after {
    box-sizing: inherit;
  }
  body {
    counter-reset: columnCount 1 alphaCount cellCount;
  }
  h1 {
    text-align: center;
  }
  .wrap {
    display: flex;
    gap: 2rem;
    position: relative;
    padding-left: 220px;
  }

  .grid {
    margin: auto;
    display: grid;
    flex: 1 0 0;
    grid-template-columns: repeat(12, 1fr);
    padding-top: 1.5rem;
  }

  .item {
    position: relative;
    background-color: #f9f9f9;
    border: 1px solid grey;
    aspect-ratio: 1/1;
    counter-increment: columnCount;
    min-width: 0;
    transition: background 1s ease;
  }
  .item:nth-of-type(12n + 1) {
    counter-increment: alphaCount;
  }
  .item:nth-of-type(12n + 1)::before {
    content: counter(alphaCount, upper-alpha);
    position: absolute;
    display: flex;
    align-items: center;
    top: 0;
    bottom: 0;
    left: -1.75rem;
    color: red;
    pointer-events: none;
  }
  .item:nth-of-type(n + 13)::after {
    display: none;
  }
  .item::after {
    content: counter(columnCount);
    position: absolute;
    left: 0;
    right: 0;
    text-align: center;
    top: -1.75rem;
    color: red;
    pointer-events: none;
  }
  .content {
    display: flex;
    flex-direction: column;
    justify-content: center;
    width: 100%;
    height: 100%;
    overflow: auto;
    color: #000;
    padding: 1rem;
    word-wrap: break-word;
    counter-increment: cellCount;
  }

  .words {
    cursor: move;
    transition: padding 0.5s ease;
   }
     
  .content:has(.ui-draggable-dragging) {
    overflow: visible;
  }
  .ui-droppable-active .content {
    overflow: visible;
  }
  .words.ui-draggable-dragging {
    background: blue;
    padding: 5px 10px;
    border-radius: 6px;
    z-index: 999;
    color: #fff;
    display: block;
    width: 50px;
    height: 50px;
    overflow: hidden;
  }
  #phrase {
    position: absolute;
    left: 0;
    top: 0;
    bottom: 0;
    color: #fff;
    width: 150px;
    overflow: auto;
    z-index: 2;
    display: flex;
    flex-direction: column;
    margin: 1rem 0 0.5rem;
  }
  #phrase > div {
    margin: 0 0 10px;
    width: 150px;
    padding: 5px 10px;
    background: #007bff;
    border: 2px solid #007bff;
    border-radius: 6px;
    color: #fff;
  }
  #phrase > div:empty {
    background: #fff;
    border-style: dashed;
    padding: 0px 25px;
    min-height: 30px;
  }

  .moved {
    animation: fade 3s ease;
  }
  @keyframes fade {
    0% {
      opacity: 0;
    }
    50% {
      opacity: 1;
      background: red;
    }
  }

  .item .content::before {
    content: counter(cellCount);
    position: absolute;
    top: 2px;
    left: 2px;
    font-size: smaller;
    color: #666;
    border-radius: 50%;
    border: 1px solid red;
    background: white;
    width: 1.2rem;
    height: 1, 2rem;
    display: grid;
    place-items: center;
  }

  #move-text.disabled {
    cursor: none;
    pointer-events: none;
    opacity: 0.5;
  }
  #phrase:has(.ui-droppable-active) {
    overflow: visible;
  }

  input,
  button,
  label,
  p.target {
    display: block;
    margin: 0 0 0.4rem;
    color: #000;
  }
  p.target {
    margin: 0 0 1rem;
  }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
  <!-- You'd need to set up something different for touch devices though -->

  <h1>Move testings</h1>
  <div class="wrap">
    <div>
      <label for="optionSelection">Select options</label>
      <select name="optionSelection" id="optionSelection">
        <option value="1">OptionOne</option>
        <option value="2">OptionTwo</option>
      </select>
    </div>
    <div>
    <label for="lineupColors">Colors:<br /></label>
    <select id="lineupColors">
       <option value="-">select</option>
      <option value="blue">Blue</option>
      <option value="orange">Orange</option>
      <option value="red">Red</option>
      <option value="green">Green</option>
      <option value="purple">Purple</option>
      <option value="brown">Brown</option>
      <option value="black">Black</option>
      <option value="magenta">Magenta</option>
    </select>
  </div>
    <div>
      <button id="showOptions" onclick="showOptions()" type="button">
        Show Options
      </button>
    </div>
    <div>
      <label for="inp1">Enter a row A - H</label>
      <input id="inp1" placeholder="Enter Row" />
      <label for="inp2">Enter a column 1 - 12</label>
      <input id="inp2" placeholder="Enter Column" />
      <button id="calculate">Calculate</button>
      <p class="target">The cell number is <b id="cellnum">?</b></p>
        <label for="barcode">Barcode</label>
      <input id="barcode" placeholder="" />
        <label for="pName">Plate Name</label>
      <input id="pName" placeholder="" />
      <button id="move-text" type="button">Move Text Content!</button>
    </div>
    <div id="phrase">
      <!-- remove whitespace from  inside div html and then we can use :empty in css to change background -->
      <!-- <div data-id="1"><span class="words" data-id="1">H1 text</span></div>
      <div data-id="2"><span class="words" data-id="2">H2 text</span></div>
      <div data-id="3"><span class="words" data-id="3">H3 text</span></div>
      <div data-id="4"><span class="words" data-id="4">H4 text</span></div>
      <div data-id="5"><span class="words" data-id="5">H5 text</span></div>
      <div data-id="6"><span class="words" data-id="6">H6 text</span></div>
      <div data-id="7"><span class="words" data-id="7">G1 text</span></div>
      <div data-id="8"><span class="words" data-id="8">G2 text</span></div>
      <div data-id="9"><span class="words" data-id="9">G3 text</span></div>
      <div data-id="10"><span class="words" data-id="10">G4 text</span></div> -->
    </div>

    <div id="drop-em" class="grid">
      <div class="item">
        <div class="content"></div>
        <!-- must have no spaces inside .content -->
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
      <div class="item">
        <div class="content"></div>
      </div>
    </div>
  </div>

how to add usernames to firebase (authentication) [duplicate]

I’m new to using firebase. I want users on my website to have to use a username, password, and email to sign up and sign in. In that way, in the future, I can make profiles and display usernames on a leaderboard. Currently they only need need to enter an email and password. How do i change this?

Heres my code


// Import the functions you need from the SDKs you need
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-analytics.js";
import { 
    getAuth, 
    createUserWithEmailAndPassword,
    signInWithEmailAndPassword,
    onAuthStateChanged,
    signOut
} from "https://www.gstatic.com/firebasejs/10.11.1/firebase-auth.js"

const firebaseConfig = {
  apiKey: "AIzaSyDW9v17UJm3ry7ccV7bz1To2NZdOdYBBV0",
  authDomain: "tech-2024.firebaseapp.com",
  databaseURL: "https://tech-2024-default-rtdb.asia-southeast1.firebasedatabase.app",

  projectId: "",
  storageBucket: "",
  messagingSenderId: "",
  appId: "",
  measurementId: ""
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
const auth = getAuth(app);
const userEmail = document.querySelector("#userEmail");
const userPassword = document.querySelector("#userPassword");
const authForm = document.querySelector("#authForm")
const content = document.querySelector("#content");
const signUpButton = document.querySelector("#signUpButton");
const signInButton = document.querySelector("#signInButton");
const signOutButton = document.querySelector("#signOutButton");

content.style.display ="none";

const userSignUp = async() => {
    const signUpEmail =userEmail.value 
    const signUpPassword =userPassword.value 
    createUserWithEmailAndPassword ( auth, signUpEmail, signUpPassword)
    .then (( userCredential) => {
        const user  = userCredential.user;
        console.log( user);
        alert (" your account has been created!");
    } )
    .catch ((error)=> {
        const errorCode = error.code;
        const errorMessage = error.message; 
        console.log(errorCode + errorMessage)
        alert ( errorMessage);
    

    } )
    
}

const userSignIn = async () => {
    const signInEmail = userEmail.value;
    const signInPassword = userPassword.value;
    signInWithEmailAndPassword(auth, signInEmail, signInPassword)
        .then((userCredential) => {
            const user = userCredential.user;
            alert("You have signed in");
            window.location.href = "index.html"; // Redirect to index.html
        })
        .catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            console.log(errorCode + errorMessage);
            alert(errorMessage);
        });
};

const checkAuthState =async() => {
    onAuthStateChanged(auth,user => { 
        if(user){
            authForm.style.display ='none';
            content.style.display = 'block';

        }
        else {
            authForm.style.display ='block';
            content.style.display = 'none';
        }
   
})
}
const userSignOut = async() => {
    signOut(auth).then(() => {
        alert("You have signed out successfully!");
    }).catch((error) => {})
  }

  onAuthStateChanged(auth, (user) => {
    if(user) {
      signOutButton.style.display = "block";
      message.style.display = "block";
      userName.innerHTML = user.displayName;
      userEmail.innerHTML = user.email
    } else {
      signOutButton.style.display = "none";
      message.style.display = "none";
    }
  })

  signInButton.addEventListener('click', userSignIn);
  signUpButton.addEventListener('click', userSignUp);
  signOutButton.addEventListener('click', userSignOut);,

this the relevant html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>auth</title>
    <style> body { text-align: center; background-color: lightblue }</style>
</head>

<body>
    <div id="authForm">
        <h2> sign up or sign in</h2>
        <input type="email" placeholder="email" id="userEmail" >
        <input type="password" placeholder="password" id="userPassword"> <br> <br>
        <button id="signUpButton"> sign up</button>
        <button id="signInButton"> sign in</button>
    </div>
    <div id="content">
        <h2> suprise </h2>
        <button id="signOutButton"> sign out</button>
    </div>
    
    <script type="module"  src="auth.js">
        </script>
</body>
</html>

i have tried changing the userSignUp and userSignIn code

const userSignUp = async () => {
    const signUpEmail = userEmail.value;
    const signUpPassword = userPassword.value;
    const signUpUsername = userName.value; // Get the username input value
    createUserWithEmailAndPassword(auth, signUpEmail, signUpPassword)
        .then((userCredential) => {
            const user = userCredential.user;
            // Update display name with the provided username
            user.updateProfile({
                displayName: signUpUsername
            }).then(() => {
                console.log("User profile updated successfully!");
            }).catch((error) => {
                console.log(error.message);
            });
            console.log(user);
            alert("Your account has been created!");
        })
        .catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            console.log(errorCode + errorMessage);
            alert(errorMessage);
        });
};
const userSignIn = async () => {
    const signInEmail = userEmail.value;
    const signInPassword = userPassword.value;
    const signInUsername = userName.value; // Get the username input value
    const credential = signInEmail ? signInWithEmailAndPassword(auth, signInEmail, signInPassword) : null;

    if (credential) {
        credential.then((userCredential) => {
            const user = userCredential.user;
            // Check if the username matches the one associated with the user
            if (user.displayName === signInUsername) {
                alert("You have signed in");
                window.location.href = "index.html"; // Redirect to index.html
            } else {
                alert("Incorrect username or password");
            }
        }).catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            console.log(errorCode + errorMessage);
            alert(errorMessage);
        });
    } else {
        alert("Please enter your email and password");
    }
};

What framework(s) to improve my web app? Currently using react.js

Currently I have just about my full web app built out in React using mostly just javascript and css.

While the functionality is fine, I feel like its really lacking a very fluid user interaction and experience.

Am I limiting myself by just using React and javascript?

For my backend im utilizing heroku and firestore.

For reference, my site is an AI GPT app where users can easily create there own assistants and chat with them.My project site

Ive been using react.js and just utilizing javascript and html. I’m fairly new to developing, but most videos I see the developers use jsx and typescript.

Any and all feedback is great and I have linked my site to see what it currently looks like too