Google Places API returns “This API project is not authorized to use this API” despite correct setup

I’m working with Google Places API and encountering the following error:

{

"error_message": "This API project is not authorized to use this API.",

"status": "REQUEST_DENIED"

}

Here’s what I’ve done so far:

  1. API Enabled: I’ve confirmed that the Places API is enabled in the Google Cloud Console.

  2. API Key: I’ve generated an API key and included it in my code.

  3. Billing: Billing is enabled on the project, and the account is active.

  4. Permissions: I’ve checked the permissions, and the API key has been authorized to use the Places API.

  5. Token: I’ve also checked my OAuth token, and it is valid for use.

Despite all this, I’m still receiving the error. I’ve double-checked every setting, and everything seems correct, but the API still returns this authorization error.

Does anyone have any insights on why this might be happening or any other steps I can try to fix it? Any help would be greatly appreciated!

ReactJS : anonymous function accesses an old memo state

I’m learning ReactJS, and performance optimisation. I just stumbled on a case I just cannot explain.

Below is the smallest code I could write showing the “issue” / strange behavior.

  • I have a text field changing a state => query
  • I have a memo changing its value when query changes.
  • I have a function displaying this memo.
  • I make a callback calling this function.
  • I use the callback on a button.
import { useState, useMemo, useCallback } from "react";

export function App(props) {
  const [query, setQuery] = useState('');

  const memoT = useMemo(() => (query + '_memo'), [query]);

  function callback() {
    console.log("callback : "+memoT)
  }

  const testCall = useCallback(() => callback(), []);

  return (
      <>
          <input
              type="text"
              value={query}
              onChange={event => setQuery(event.target.value)}
          />
          <p>{memoT}</p>
          <button onClick={testCall} >run testCall</button>
      </>
  );
}

What I would have expected :
When called, callback read the memoT value from its object (maybe phishy here), and displays whatever is typed in the textfield + _memo.

What I have :
When read inside callback, the value of memoT is always its initial value.
But when read outside (actually when called in the App function), the memoT is correct, and is the one displayed.

What I understand/suspects :
When the callback is created, it “remembers” the current state, and the memoT reference at that point ? But then … how to I get my callback to read its object state ?

Loading a larger file with ffmpeg crashes on safari mobile

My use case is to extract audio from video file to minimize the size of sent file over network. Everything works fine on a computer (chrome, safari) but it’s either stuck or crashes on ios safari. AFAIK it crashes not while executing the ffmpeg command, but while trying to load the input file, which is quite big (500MB+).

I load the ffmpeg like this:

  const baseURL = "https://unpkg.com/@ffmpeg/[email protected]/dist/esm";
  await ffmpeg.load({
    coreURL: await toBlobURL(`${baseURL}/ffmpeg-core.js`, "text/javascript"),
    wasmURL: await toBlobURL(`${baseURL}/ffmpeg-core.wasm`, "application/wasm"),
    workerURL: await toBlobURL(
      `${baseURL}/ffmpeg-core.worker.js`,
      "text/javascript"
    ),
  });

And I try to load the file like this:

await ffmpeg.writeFile(inputFileName, await fetchFile(file));

But it does not go past this step. How can I work around this limitation? Is there any other way to load larger files?

Thank you.

Javascript can output the a js script using it’s file name

I have a simple html file:

  • it has script in the head. Control.js as an example.
  • I tried to console.log the script using the the filename, ‘Control’. it returns the definition or the script of the file.
  • Does this mean, the browser will auto declares a variable on every script tag using the filename?
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script type="text/javascript" src="Control.js"></script>
    <title>Document</title>
</head>
<body>
    <script>
        console.log(Control);
    </script>
</body>
</html>

I can’t find the reason for this. is this a normal behaviour?

Refreshing Discord events

Hello so I wanted to refresh my events, I thought i knew how but i guess i didn’t. It enters the forEach loop although it errors out at the part where it deletes the require cache

const fs = require('fs');
const path = require('path');

function reloadEvent() {
    try {
        const modelsPath = path.join(__dirname, '../src/events');
        const modelFiles = fs.readdirSync(modelsPath).filter(file => file.endsWith('.js'));

        modelFiles.forEach((file) => {
            try {
                console.log("Entered for each");
                const filePath = path.join(modelsPath, file);
                delete require.cache[require.resolve(filePath)];
                console.log(`Deleting cache for: ${file}`);
                const newEvent = require(filePath);
                console.log(`Requiring event: ${file}`);
                if (newEvent.once) {
                    client.once(newEvent.name, (...args) => newEvent.execute(...args));
                } else {
                    client.on(newEvent.name, (...args) => newEvent.execute(...args));
                }
                console.log(`Reloaded event: ${newEvent.name}`);
            } catch (error) {
                console.error(`Failed to reload event: ${file}`, error);
                
            }
        })

        console.log('events reloaded');
    } catch (error) {
        console.error(`Error refreshing events: ${error}`);
    }
}

module.exports = reloadEvent;

If there is an actual way of refreshing discord events, please tell me. I haven’t seen anything in the guides

Uncaught SyntaxError: Unexpected token ‘{‘ (at index.html:20:35) and Uncaught SyntaxError: Unexpected token ‘<' (at bundle.js:1:1)

While trying to run application locally I am getting these errors, I just upgraded to webpack-dev-server from 2.11.3 to 4.15.2.
Below are my configs and files

webpack.config.js

const autoprefixer = require('autoprefixer');
const postcssFlexbugsFixes = require('postcss-flexbugs-fixes');
const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const getClientEnvironment = require('./env');
const paths = require('./paths');

const babelRuntimeEntry = require.resolve('babel-preset-react-app');
const babelRuntimeEntryHelpers = require.resolve(
  '@babel/runtime/helpers/esm/assertThisInitialized',
  { paths: [babelRuntimeEntry] },
);
const babelRuntimeRegenerator = require.resolve('@babel/runtime/regenerator', {
  paths: [babelRuntimeEntry],
});

const publicPath = '/';
const publicUrl = '';
const env = getClientEnvironment(publicUrl);

module.exports = {
  mode: 'development',
  devtool: 'cheap-module-source-map',
  entry: [
    require.resolve('./polyfills'),
    require.resolve('react-dev-utils/webpackHotDevClient'),
    paths.baseline,
    paths.appIndexJs,
  ],
  output: {
    pathinfo: true,
    filename: 'static/js/bundle.js',
    chunkFilename: 'static/js/[name].chunk.js',
    publicPath,
    devtoolModuleFilenameTemplate: (info) => path.resolve(info.absoluteResourcePath).replace(/\/g, '/'),
  },
  infrastructureLogging: {
    level: 'verbose', // Enable detailed logging
  },
  resolve: {
    modules: ['node_modules', path.resolve(__dirname, 'node_modules'), paths.appNodeModules].concat(
      process.env.N_PATH.split(path.delimiter).filter(Boolean),
    ),
    extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'],
    alias: {
      'react-native': 'react-native-web',
    },
    plugins: [
      new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson, babelRuntimeEntry,
        babelRuntimeEntryHelpers,
        babelRuntimeRegenerator]),
    ],
  },
  module: {
    strictExportPresence: true,
    rules: [
      {
        test: /.(js|jsx|mjs)$/,
        enforce: 'pre',
        use: [
          {
            options: {
              formatter: eslintFormatter,
              eslintPath: require.resolve('eslint'),

            },
            loader: require.resolve('eslint-loader'),
          },
        ],
        include: paths.appSrc,
      },
      {
        oneOf: [
          {
            test: [/.bmp$/, /.gif$/, /.jpe?g$/, /.png$/],
            loader: require.resolve('url-loader'),
            options: {
              limit: 10000,
              name: 'static/media/[name].[hash:8].[ext]',
            },
          },
          {
            test: /.(js|jsx|mjs)$/,
            include: paths.appSrc,
            loader: require.resolve('babel-loader'),
            options: {
              cacheDirectory: true,
            },
          },
          {
            test: /.less$/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  // Necessary for external CSS imports to work
                  // https://github.com/facebookincubator/create-react-app/issues/2677
                  ident: 'postcss',
                  plugins: () => [
                    postcssFlexbugsFixes,
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
              require.resolve('less-loader'),
            ],
          },
          {
            test: /.css$/,
            use: [
              require.resolve('style-loader'),
              {
                loader: require.resolve('css-loader'),
                options: {
                  importLoaders: 1,
                },
              },
              {
                loader: require.resolve('postcss-loader'),
                options: {
                  ident: 'postcss',
                  plugins: () => [
                    postcssFlexbugsFixes,
                    autoprefixer({
                      browsers: [
                        '>1%',
                        'last 4 versions',
                        'Firefox ESR',
                        'not ie < 9', // React doesn't support IE8 anyway
                      ],
                      flexbox: 'no-2009',
                    }),
                  ],
                },
              },
            ],
          },
          {
            exclude: [/.(js|jsx|mjs)$/, /.html$/, /.json$/],
            loader: require.resolve('file-loader'),
            options: {
              name: 'static/media/[name].[hash:8].[ext]',
            },
          },
        ],
      },
    ],
  },
  plugins: [
    new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
    new HtmlWebpackPlugin({
      inject: true,
      template: paths.appHtml,
      publicPath,
    }),
    new webpack.DefinePlugin(env.stringified),

    new CaseSensitivePathsPlugin(),
    new webpack.IgnorePlugin({
      resourceRegExp: /^./locale$/,
      contextRegExp: /moment$/,
    }),
  ],
  node: {
    __dirname: true, // Allow __dirname to be used as in Node.js
    __filename: true, // Allow __filename to be used as in Node.js
    global: true, // Allow global to be used as in Node.js
  },
  performance: {
    hints: false,
  },
};

webpackDevServerConfig.js

const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware');
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware');
const ignoredFiles = require('react-dev-utils/ignoredFiles');
const config = require('./webpack.config.dev');
const paths = require('./paths');

const protocol = 'https';
const host = '0.0.0.0';

module.exports = function (proxy, allowedHost) {
  return {
    port: 3000,
    allowedHosts: 'all',
    compress: true,
    hot: true,
    devMiddleware: {
      publicPath: config.output.publicPath,
    },
    static: {
      directory: paths.appBuild,
      watch: {
        ignored: ignoredFiles(paths.appSrc),
      },
    },
    https: protocol === 'https',
    host,
    historyApiFallback: {
      disableDotRule: true,
    },
    client: {
      logging: 'info',
      overlay: {
        warnings: true,
        errors: true,
      },
      webSocketURL: {
        hostname: allowedHost,
      },
    },
    proxy,
    setupMiddlewares: (middlewares, devServer) => {
      devServer.app.use(errorOverlayMiddleware());
      devServer.app.use(noopServiceWorkerMiddleware());
      return middlewares;
    },
  };
};

public/index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="theme-color" content="#000000">
  <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
  <link href='//fonts.googleapis.com/css?family=Lato:400,300,600' rel='stylesheet' type='text/css'>
  <link href="/web-fonts/2.6.0/webfonts-eg.min.css" rel="stylesheet" type="text/css">
  <title>app</title>
  <base href="/" />
</head>
<body>
  <noscript>
    You need to enable JavaScript to run this app.
  </noscript>
  <script>
    window.__PRELOADED_STATE__ = {{{ json runtime }}};
  </script>
  <div id="root" class="root"></div>
</body>
</html>

I could also see that in static/js/bundles.js when viewed from Sources tab, the content should be all the JS from the entry point and beyond but could see the html similar to that of index.html, may be that is what causing the “Unexpected token ‘<‘ (at bundle.js:1:1)” error.

My index.js already has frontend static path set

app.use('/static', express.static(path.join(__dirname, '../build/static'), { maxAge: '30d' })); 

Already tried these:

but there seems to be no way I can get this fixed 🙁 Absolutely no idea whats wrong here, any help is appreciated. Thanks in advance!

Excel spreadsheet to json API [closed]

I have a client that wants to update and add properties and property details including images via an excel spreadsheet. They are using WordPress as a CMS but I want to keep the property section separate. I’d like to access data via a jSON API and use some sort front-end framework/library such as React or Vue. What would be the simplest solution for accomplishing this task?

Expo React native Stack headerRight with custom component does not redirect using Link

I am starting with Expo and React Native. I want to redirect to a custom page using Stack in Expo and React native. The Link work in the first example, but in the headerRight does not. I check the stack documentation but it does not say about using redirect in the headerRight. But it does say that accepts React component. The Link works outside of Stack and I also have a menu in index.js where I have more links and all of them work just fine with the stack functionality.

Can you help me to understand why the headerRight button may not be working? Thank you for your help.

_layout.js

import { Stack, Link } from "expo-router";
import { View, Text, StyleSheet, Pressable } from "react-native";

export default function Layout() {
  return (
    <View className="flex-1 bg-black">
      <Link href="/about" asChild>  <-- Working
        <Pressable>
          <Text style={styles.buttonText}>About</Text>
        </Pressable>
      </Link>
      <Stack
        screenOptions={{
          headerStyle: {
            backgroundColor: "#888",
          },
          headerTintColor: "#fff",
          headerTitleStyle: {
            fontWeight: "bold",
          },
          headerRight: () => (
            <Link href="/about" asChild> <-- Does not work
              <Pressable>
                <Text style={styles.buttonText}>About</Text>
              </Pressable>
            </Link>
          ),
        }}
      >
        <Stack.Screen name="index" options={{ title: "Home" }} />
        <Stack.Screen name="about" options={{ title: "About" }} />
      </Stack>
    </View>
  );
}

about.js

import { ScrollView, Text } from "react-native";

export default function About() {
  return (
      <Text classname="text-white text-white/900" style={{ marginBottom: 40 }}>
        Lorem ipsum..
      </Text>     
  );
}

index.js

import { useCameraPermissions } from "expo-camera";
import { Link } from "expo-router";
import { useEffect, useState } from "react";
import { StyleSheet, Text } from "react-native";
import { View, TouchableOpacity } from "react-native";

export default function Index() {
  return (
       <View className=" bg-orange-300 items-center justify-center">          
          <Link href="/camera" asChild>
            <TouchableOpacity style={styles.button}>
              <Text style={styles.buttonText}>Escaner</Text>
            </TouchableOpacity>
          </Link>
      ...many other...
          <Link href="/about" style={styles.buttonText} asChild>
            <TouchableOpacity style={styles.button}>
              <Text style={styles.buttonText}>About</Text>
            </TouchableOpacity>
          </Link>
        </View> 
  );
}

package.json

{
  "name": "codebar-app",
  "version": "1.0.0",
  "main": "expo-router/entry",
  "scripts": {
    ...
  },
  "dependencies": {    
    "@react-native-async-storage/async-storage": "^2.1.2",
    "@react-native-picker/picker": "2.9.0",
    "expo": "~52.0.19",
    "expo-camera": "~16.0.10",
    "expo-constants": "~17.0.8",
    "expo-linking": "~7.0.5",
    "expo-router": "~4.0.19",
    "expo-status-bar": "~2.0.1",
    "nativewind": "^2.0.11",
    "react": "18.3.1",
    "react-native": "0.76.5",    
    "react-native-safe-area-context": "4.12.0",
    "react-native-screens": "~4.4.0",    
    "react-native-web": "~0.19.13"
  },

Content Stop taking width if use container-type: inline-size; with flex property on parent

I have used container-type: inline-size; css Property to apply diff css when its element width got changes Like :

`.alert-container {
    container-type: inline-size;
  }
  @container (width <=320px) {
    .alert {
      border-radius: $u-8 !important;
    }
    .wideActionButtons {
      display: none !important;
    }}`

But when its parent element use flex property then the component breaks. its showing 0 width but showing height
Breaking Alert
Since i can’t /don’t want to give this component fixed width.
so have applied diff css property property but nothing work.
I don’t want to remove container-type: inline-size; because i haven’t find alternative of this for adjust css of element and its child when its width or height change.

  • @media query is working on viewport dimensions.

How to stop event propagation on range input?

I’m coding a simple volumen slider using a range input but when the @input event fires on the range input it also fires a click event on the parent div, how can I avoid that from happening?

      <div
        @mouseenter="showVolumeControl"
        @mouseleave="hideVolumeControl"
        @click="muteVolume"
      >
        <input
          v-if="volumeControl"
          @input="changeVolume"
          v-model.number="volume"
          type="range"
          min="0"
          max="1"
          step="0.01"
          id="volume-slider"
        />
        <svg class="icon">
          <use v-if="volume > 0.5" xlink:href="#icon-volume-up"></use>
          <use v-else-if="volume === 0" xlink:href="#icon-mute"></use>
          <use v-else xlink:href="#icon-volume-down"></use>
        </svg>
      </div>

React Native Text to Speech with Online Transcription

Is there any way you’d recommend to get live (streaming) transcribed audio using a model on par with OpenAI Whisper or AssemblyAI in React Native.

I made a NodeJS server that forwarded my messages and transcription from React Native to Deepgram. It fails 90% of the time but works sometimes. I know that the issue occurs before the response is received from Deepgram. Are the websocket packets getting to big for longer transcriptions? Am I sending Finalize at the wrong time?

speech.ts

import { Audio } from "expo-av";
import { useEffect, useRef, useState } from "react";

export default function useSpeech() {
    const [recording, setRecording] = useState<Audio.Recording | null>(null);
    const [messages, setMessages] = useState<string[]>([]);
    const [inProgressMessage, setInProgressMessage] = useState<string | null>(null);
    const wsRef = useRef<WebSocket | null>(null);
    const [isAudioSetup, setIsAudioSetup] = useState(false);
    const [isWSReady, setIsWSReady] = useState(false);

    // Create WebSocket connection to Deepgram
    const setupWS = () => {
        const newWs = new WebSocket(
            `wss://time-defend.fly.dev`,
        );
        wsRef.current = newWs;
        // Handle WebSocket events
        newWs.onopen = () => {
            console.log('WebSocket connected');
            if (newWs === wsRef.current)
                setIsWSReady(true);
            console.log(newWs, wsRef.current, "newWs === ws", newWs === wsRef.current)
        };
        newWs.onmessage = (event) => {
            console.log('Received message:', event.data);
            const data = JSON.parse(event.data);
            // handle transcription
        };
        newWs.onerror = (error) => {
            console.error('WebSocket error:', error);
        };
        newWs.onclose = (event) => {
            console.log('WebSocket closed:', event.reason);
            if (newWs === wsRef.current)
                setIsWSReady(false);
        };
        setIsWSReady(false);
    };

    useEffect(() => {
        setupWS();
        // Request permissions and set up audio
        const setupAudio = async () => {
            try {
                await Audio.requestPermissionsAsync();
                await Audio.setAudioModeAsync({
                    allowsRecordingIOS: true,
                    playsInSilentModeIOS: true,
                });
                setIsAudioSetup(true);
            } catch (err) {
                console.error('Failed to setup audio:', err);
            }
        };
        setupAudio();

        // Cleanup WebSocket when unmounting
        return () => {
            if (wsRef.current) {
                wsRef.current.close();
            }
        };
    }, []);

    // Start Recording + Open WebSocket
    const startRecording = async () => {
        try {
            // Create a new recording
            const { recording: newRecording } = await Audio.Recording.createAsync(
                Audio.RecordingOptionsPresets.HIGH_QUALITY,
                (status) => {
                    // This callback receives recording status updates
                    console.log('Recording status:', status);
                },
                100 // Update interval in milliseconds
            );
            setRecording(newRecording);

            if (!wsRef.current) {
                throw new Error('WebSocket not initialized');
            }
        } catch (err) {
            console.error('Failed to start recording:', err);
        }
    };

    // Stop Recording + send "Finalize"
    const stopRecording = async () => {
        try {
            setIsWSReady(false);
            if (!recording) return;

            await recording.stopAndUnloadAsync();
            recording._options?.web.bitsPerSecond
            const uri = recording.getURI();
            setRecording(null);

            // wss://api.deepgram.com/v1/listen?punctuate=true&channels=1&sample_rate=16000&encoding=linear16
            // get the recording and encode it the right way as a string
            // Get the audio file as a blob

            // Web: Use fetch and Blob
            const response = await fetch(uri!);
            const blob = await response.blob();
            const reader = new FileReader();

            reader.onloadend = () => {
                let base64String = reader.result!;

                // console.log(base64String)

                // wsRef.current!.send(Buffer.from(base64String.split(",")[1], "base64"));
                wsRef.current!.send(base64String as ArrayBuffer)
                wsRef.current!.send("Finalize");

                // Once done, let Deepgram know we're finished sending audio
                // if (wsRef.current && wsRef.current.readyState === WebSocket.OPEN) {
                //   wsRef.current.send('Finalize');
                // }
            };

            reader.readAsArrayBuffer(blob);

            console.log('Recording stopped, file saved at:', uri);
        } catch (err) {
            console.error('Failed to stop recording:', err);
        }
    };
    const isReady = isAudioSetup && wsRef.current?.readyState === WebSocket.OPEN && isWSReady;
    console.log("isReady", isReady, isAudioSetup, wsRef.current?.readyState === WebSocket.OPEN, isWSReady)
    const isRecording = recording !== null;
    return { isReady, isRecording, startRecording, stopRecording, inProgressMessage, messages };
}

AgGrid VUE without Node.js

im trying to bundle aggrid-vue locally and use it in some of my pages where i require tables. I am not running a node.js server – My application is a python back-end with fastapi serving the endpoints and pages.
I have the following package.json and vite configurations that i use to bundle and try bundle aggrid for use in my pages.

package.json:

{
  "name": "frontend",
  "version": "1.0.0",
  "main": "main.js",
  "scripts": {
    "build": "vite build"
  },
  "dependencies": {
    "ag-grid-vue3": "^33.1.1"
  },
  "devDependencies": {
    "vite": "^6.2.2"
  }
}

vite.config.js

import { defineConfig } from 'vite';
import { resolve } from 'path';

export default defineConfig({
  build: {
    outDir: 'dist',
    lib: {
      entry: resolve(__dirname, 'dependencies/vite-entries/aggrid.js'),
      name: 'AgGrid',
      fileName: 'aggrid-bundle',
      formats: ['umd']
    },
    rollupOptions: {
      // Instead of making Vue external, we'll handle it differently
      output: {
        // Provide globals for UMD build
        globals: {
          vue: 'Vue'
        }
      }
    }
  },
  resolve: {
    // Ensure Vue is resolved correctly
    alias: {
      'vue': 'Vue'
    }
  },
  define: {
    'process.env': {
      NODE_ENV: JSON.stringify(process.env.NODE_ENV || 'production')
    }
  }
});

aggrid.js

import { AgGridVue } from 'ag-grid-vue3';
import { AllCommunityModule, ModuleRegistry } from 'ag-grid-community'; 
import 'ag-grid-community/styles/ag-grid.css';
import 'ag-grid-community/styles/ag-theme-alpine.css';

ModuleRegistry.registerModules([AllCommunityModule]);
if (typeof window !== 'undefined') {
  window.AgGrid = {
    AgGridVue
  };
}

export { 
  AgGridVue
};

after doing this i run an npm run build
this generates two files for which i can now include in my page

    <link rel="stylesheet" href="/libs/aggrid-bundle.css">
    <script src="/libs/aggrid-bundle.umd.js" type="module"></script>

the folowing is my table.js component where im trying to use this grid

export const DTable = {
    name: 'DataTable',
    components: { 'ag-grid-vue': window.AgGridVue },
    props: {
        containerId: { type: String, default: null },
        panelId: { type: String, default: null },
        data: {
            type: Object,
            default: null
        },
        dataModelType: {
            type: String,
            default: 'datatable'
        }
    },
    
    setup(props) {
        const { ref, onMounted, onUnmounted, watch, inject } = Vue;
        // Row Data: The data to be displayed.
        // Simple test data
        const rowData = ref([
            { make: "Tesla", model: "Model Y", price: 64950 },
            { make: "Ford", model: "F-Series", price: 33850 },
            { make: "Toyota", model: "Corolla", price: 29600 }
        ]);

        const colDefs = ref([
            { field: "make" },
            { field: "model" },
            { field: "price" }
        ]);
        
        // Add debugging
        onMounted(() => {
            console.log("AgGridVue component:", window.AgGrid.AgGridVue);
            console.log("Test data:", rowData.value);
            processData();
        });

        
        const gridOptions = ref({
            defaultColDef: {
                sortable: true,
                filter: true,
                resizable: true
            }
        });
        
        return {
            rowData,
            colDefs,
        };
    },
    template: `
        <!-- The AG Grid component -->
        <div style="height: 500px; width: 100%;" class="ag-theme-alpine">
            <ag-grid-vue
                style="height: 100%; width: 100%;"
                :column-defs="colDefs"
                :row-data="rowData">
            </ag-grid-vue>
        </div>
    `
};

the problem im running into is that there are no errors and the logs from the onMounted looks good. but no table is actually rendered. When i loook at the DOM that is rendered, it looks like this

<ag-grid-vue 
  column-defs="[object Object],[object Object],[object Object]" 
  row-data="[object Object],[object Object],[object Object]" 
  style="height: 100%; width: 100%;">
</ag-grid-vue>

The bindings seem to show objects that are never really rendered properly.
If you are familiar with AgGrid – i could use your help here.

update id name on html table elements when delete middle rows

i have HTML elements like this

<table id="table1">
    <thead>
        <tr>
            <th>EVALUATION</th>
            <th></th>
        </tr>
    </thead>
    <tbody>

    </tbody>
</table>
<input id="button_delete" type="button" onclick="deleteRow()" value="DELETE">
<input id="button_add" type="button" onclick="addRow()" value="ADD"> 

This is the code for addRow function

function addRow(){
    var tblList = document.getElementById("table1");
    var tblBody = tblList.tBodies[0];

    const lastRow = document.querySelector('#table1 tr:last-child td:first-child+td input') || 0;
    const length = tblBody.rows.length;

    try {
        var row = tblBody.insertRow(length);
    } catch(e) {
        console.log(e);
        return false;
    }

    var newCell0 = row.insertCell(0);
    newCell0.innerHTML = `
    <table style="width: 100%;">
        <tr>
            <td>
                <input type="checkbox" id="eval_cb0_${length}" name="eval_cb0_${length}" value="checked" >
            </td>
            <td>
                <label for="eval_cb0_${length}">EVAL 1</label>
            </td>
        </tr>
        <tr>
            <td>
                <input type="checkbox" id="eval_cb1_${length}" name="eval_cb1_${length}" value="checked" >
            </td>
            <td>
                <label for="eval_cb1_${length}">EVAL 2</label>
            </td>
        </tr>
    </table>
    `;

    var newCell1 = row.insertCell(1);
    newCell1.innerHTML = `
        <input class="row-cb" type="checkbox" name="cb_clone[]">
    `;
}

This is the code for deleteRow function

function deleteRow() {
    const checkboxes = document.querySelectorAll(".row-cb");

    const userConfirm = confirm("Are u sure?");
    if (!userConfirm) return;
    
    checkboxes.forEach((checkbox) => {
        if(checkbox.checked){
            const row = checkbox.closest('tr');
            row.remove();
        }
    });
}

The function addRow will add row in the last child of a table, and deleteRow will delete checked row. The problem is, when I delete middle row, i.e. row 2 from 3 rows available, then the row 3 element’s id still not updated even though there is only 2 rows remaining. How to update the row 3’s id name? Thanks