[SOLVED] Not saving my contract as a erc721 token

pragma solidity ^0.8.0;

import "../node_modules/@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "../node_modules/@openzeppelin/contracts/utils/Counters.sol";

contract NftiumToken is ERC721 {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    constructor() ERC721("NftiumToken","NFTM"){}

    struct Item {
        uint256 id;
        address creator;
        string  uri;
    }

    mapping(uint256 => Item) public Items;

    function createItem(string memory uri) public returns (uint256){
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _safeMint(msg.sender, newItemId);

        Items[newItemId] = Item(newItemId, msg.sender, uri);

        return newItemId;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return Items[tokenId].uri;

    }

}

const createItemForm = document.getElementById(“createItem”);

const createItemNameField = document.getElementById(“txtCreateItemName”);

const createItemDiscriptionField = document.getElementById(“txtCreateItemDiscription”);

const numberCreateItemPriceField = document.getElementById(“numberCreateItemPrice”);

const createItemStatusField = document.getElementById(“selectCreateItemStatus”);

const selectCreateItemStatusField = document.getElementById(“selectCreateItemStatus”);

const fileCreateItemFile = document.getElementById(“fileCreateItemFile”);

const openCreateItemButton = document.getElementById(“btnOpenCreateItem”);

openCreateItemButton.onclick = () => showElement(createItemForm);

document.getElementById(“btnCloseCreateItem”).onclick = () => hideElement(createItemForm);

document.getElementById(“btnCreateItem”).onclick = createItem;

createItem = async ()=>{
    if(fileCreateItemFile.files.length == 0){
        alert("Please Select a File!");
        return;
    }else if(createItemNameField.value.length ==0){
        alert("Please Enter Name!");
        return; 
    }
     const nftFile = new Moralis.File("nftFile.jpg", fileCreateItemFile.files[0]);
     await nftFile.saveIPFS();

     console.log(nftFile.url());
     console.log(nftFile.hash());

     const nftFilePath = nftFile.url();
     const nftFileHash = nftFile.hash();

     const metadata ={
        name : createItemNameField.value,
        description : createItemDiscriptionField.value,
        image : nftFilePath,
    };

    const nftFileMetadataFile = new Moralis.File("metadata.json", {base64 : btoa(JSON.stringify(metadata))});
    await nftFileMetadataFile.saveIPFS();

    const nftFileMetadataFilePath = nftFileMetadataFile.url();
    const nftFileMetadataFileHash = nftFileMetadataFile.hash();

    const nftId = await mintNft(nftFileMetadataFilePath);

mintNft = async (metadataUrl)=>{
    const receipt = await tokenContract.methods.createItem(metadataUrl).send({from:  ethereum.selectedAddress});
    console.log(receipt);
    return receipt.events[0].id;
}

sharing function contract codes because after my contract get executed on polygon testnet it showing on block explorer but does not show as an erc721 token. another thing is not saving in moralis table as token owner saving in item only. and sometimes it’s even not saving on the table. Using truffle and using youtube playlist.
can anyone help?

In case if you use truffle you need manually do some transactions to mine blocksOnly after several transactions your previos transaction will be mined

the transaction is getting minted I can see on block explorer for the confirmed transaction.

> Blockquote

even I am not getting any token_id back as we can see on the consol log.

Problem solved.
a special big thank you for @cryptokid help me a lot.