Case Study - Striver Technosoft http://www.strivertech.com Agile Organization | Top Web and Mobile Development Solution Tue, 27 Feb 2024 06:03:34 +0000 en-US hourly 1 https://wordpress.org/?v=6.8.1 http://www.strivertech.com/wp-content/uploads/2022/04/cropped-cropped-Striver-Technology-2-32x32.png Case Study - Striver Technosoft http://www.strivertech.com 32 32 Quickstart: Get started with Gemini using the REST API http://www.strivertech.com/rest_quickstart/?utm_source=rss&utm_medium=rss&utm_campaign=rest_quickstart Tue, 27 Feb 2024 05:55:15 +0000 https://www.strivertech.com/?p=6982 Quickstart: Get started with Gemini using the REST API with React Native https://www.strivertech.com/wp-content/uploads/2024/02/gemin.mp4 Greetings, developers! Today, we embark on an exciting journey to seamlessly integrate Gemini with REST API in your React Native applications. Inspired by Google’s REST API Quickstart, this step-by-step guide aims to empower you with enhanced testing capabilities and a streamlined development […]

The post Quickstart: Get started with Gemini using the REST API first appeared on Striver Technosoft.

]]>

Quickstart: Get started with Gemini using the REST API with React Native

Greetings, developers! Today, we embark on an exciting journey to seamlessly integrate Gemini with REST API in your React Native applications. Inspired by Google’s REST API Quickstart, this step-by-step guide aims to empower you with enhanced testing capabilities and a streamlined development process.

If you want to quickly try out the Gemini API, you can use curl commands to call the methods in the REST API. The examples in this tutorial show calls for each API method.

The Colab uses Python code to set an environment variable and to display an image, but you don’t need Colab to work with the REST API. You should be able to run all of the curl examples outside of Colab, without modification, as long as you have API_KEY set as described in the next section.

For each curl command, you must specify the applicable model name and your API key.

Ensure you have the following prerequisites ready before diving into the integration:

  • A React Native project set up
  • Access to Gemini’s REST API (credentials and endpoint)

To use the Gemini API, you’ll need an API key. If you don’t already have one, create a key in Google AI Studio.

In Colab, add the key to the secrets manager under the “🔑” in the left panel. Give it the name API_KEY. You can then add it as an environment variable to pass the key in your curl call.

In a terminal, you can just run API_KEY="Your API Key".

 
import os
from google.colab import userdata

os
.environ['API_KEY'] = userdata.get('API_KEY')

Use the generateContent method to generate a response from the model given an input message. If the input contains only text, use the gemini-pro model.

 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[{
          "text": "Write a story about a magic backpack."}]}]}' 2> /dev/null
 
{
  "candidates": [
    {
      "content": {
        "parts": [
          {
            "text": "Once upon a time, in a small town nestled at the foot of towering mountains, there lived a young girl named Lily. Lily was an adventurous and imaginative child, always dreaming of exploring the world beyond her home. One day, while wandering through the attic of her grandmother's house, she stumbled upon a dusty old backpack tucked away in a forgotten corner. Intrigued, Lily opened the backpack and discovered that it was an enchanted one. Little did she know that this magical backpack would change her life forever.\n\nAs Lily touched the backpack, it shimmered with an otherworldly light. She reached inside and pulled out a map that seemed to shift and change before her eyes, revealing hidden paths and distant lands. Curiosity tugged at her heart, and without hesitation, Lily shouldered the backpack and embarked on her first adventure.\n\nWith each step she took, the backpack adjusted to her needs. When the path grew treacherous, the backpack transformed into sturdy hiking boots, providing her with the confidence to navigate rocky terrains. When a sudden rainstorm poured down, the backpack transformed into a cozy shelter, shielding her from the elements.\n\nAs days turned into weeks, Lily's journey took her through lush forests, across treacherous rivers, and to the summits of towering mountains. The backpack became her loyal companion, guiding her along the way, offering comfort, protection, and inspiration.\n\nAmong her many adventures, Lily encountered a lost fawn that she gently carried in the backpack's transformed cradle. She helped a friendly giant navigate a dense fog by using the backpack's built-in compass. And when faced with a raging river, the backpack magically transformed into a sturdy raft, transporting her safely to the other side.\n\nThrough her travels, Lily discovered the true power of the magic backpack. It wasn't just a magical object but a reflection of her own boundless imagination and tenacity. She realized that the world was hers to explore, and the backpack was a tool to help her reach her full potential.\n\nAs Lily returned home, enriched by her adventures and brimming with stories, she decided to share the magic of the backpack with others. She organized a special adventure club, where children could embark on their own extraordinary journeys using the backpack's transformative powers. Together, they explored hidden worlds, learned valuable lessons, and formed lifelong friendships.\n\nAnd so, the legend of the magic backpack lived on, passed down from generation to generation. It became a reminder that even the simplest objects can hold extraordinary power when combined with imagination, courage, and a sprinkle of magic."
          }
        ],
        "role": "model"
      },
      "finishReason": "STOP",
      "index": 0,
      "safetyRatings": [
        {
          "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HATE_SPEECH",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_HARASSMENT",
          "probability": "NEGLIGIBLE"
        },
        {
          "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
          "probability": "NEGLIGIBLE"
        }
      ]
    }
  ],
  "promptFeedback": {
    "safetyRatings": [
      {
        "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HATE_SPEECH",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_HARASSMENT",
        "probability": "NEGLIGIBLE"
      },
      {
        "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
        "probability": "NEGLIGIBLE"
      }
    ]
  }
}

If the input contains both text and image, use the gemini-pro-vision model. The following snippets help you build a request and send it to the REST API.

 
curl -o image.jpg https://storage.googleapis.com/generativeai-downloads/images/scones.jpg
 
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  385k  100  385k    0     0  2053k      0 --:--:-- --:--:-- --:--:-- 2050k
 
import PIL.Image

img
= PIL.Image.open("image.jpg")
img
.resize((512, int(img.height*512/img.width)))

png

 
echo '{
  "contents":[
    {
      "parts":[
        {"text": "What is this picture?"},
        {
          "inline_data": {
            "mime_type":"image/jpeg",
            "data": "'$(base64 -w0 image.jpg)'"
          }
        }
      ]
    }
  ]
}' > request.json
 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro-vision:generateContent?key=${API_KEY} \
        -H 'Content-Type: application/json' \
        -d @request.json 2> /dev/null | grep "text"
 
"text": " The picture shows a table with a white tablecloth. On the table are two cups of coffee, a bowl of blueberries, and a plate of scones. There are also some flowers on the table."

Using Gemini, you can build freeform conversations across multiple turns.

 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [
        {"role":"user",
         "parts":[{
           "text": "Write the first line of a story about a magic backpack."}]},
        {"role": "model",
         "parts":[{
           "text": "In the bustling city of Meadow brook, lived a young girl named Sophie. She was a bright and curious soul with an imaginative mind."}]},
        {"role": "user",
         "parts":[{
           "text": "Can you set it in a quiet village in 1600s France?"}]},
      ]
    }' 2> /dev/null | grep "text"
 
"text": "In the quaint village of Fleur-de-Lys, nestled amidst the rolling hills of 17th century France, lived a young maiden named Antoinette. She possessed a heart brimming with curiosity and a spirit as vibrant as the wildflowers that bloomed in the meadows.\n\nOne sunny morn, as Antoinette strolled through the cobblestone streets, her gaze fell upon a peculiar sight—a weathered leather backpack resting atop a mossy stone bench. Intrigued, she cautiously approached the bag, her fingers tracing the intricate carvings etched into its surface. As her fingertips grazed the worn leather, a surge of warmth coursed through her body, and the backpack began to emit a soft, ethereal glow."

Every prompt you send to the model includes parameter values that control how the model generates a response. The model can generate different results for different parameter values. Learn more about model parameters.

Also, you can use safety settings to adjust the likelihood of getting responses that may be considered harmful. By default, safety settings block content with medium and/or high probability of being unsafe content across all dimensions. Learn more about safety settings.

The following example specifies values for all the parameters of the generateContent method.

 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
        "contents": [{
            "parts":[
                {"text": "Write a story about a magic backpack."}
            ]
        }],
        "safetySettings": [
            {
                "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
                "threshold": "BLOCK_ONLY_HIGH"
            }
        ],
        "generationConfig": {
            "stopSequences": [
                "Title"
            ],
            "temperature": 1.0,
            "maxOutputTokens": 800,
            "topP": 0.8,
            "topK": 10
        }
    }'  2> /dev/null | grep "text"
 
"text": "Once upon a time, in a small town nestled at the foot of a majestic mountain range, lived a young girl named Lily. Lily was a bright and curious child who loved to explore the world around her. One day, while playing in the forest near her home, she stumbled upon a hidden cave. Intrigued, she stepped inside, and to her amazement, she discovered a dusty old backpack lying in a corner.\n\nCuriosity piqued, Lily reached out and picked up the backpack. As soon as her fingers brushed against the worn leather, she felt a strange tingling sensation coursing through her body. Suddenly, the backpack began to glow, emitting a soft, ethereal light that filled the cave.\n\nWith wide-eyed wonder, Lily opened the backpack to find it filled with an assortment of magical objects. There was a compass that always pointed to the nearest adventure, a magnifying glass that could reveal hidden secrets, a telescope that allowed her to see distant lands, and a book that contained the knowledge of the universe.\n\nOverjoyed with her discovery, Lily took the magic backpack home and began using its contents to explore the world in ways she had never imagined. She followed the compass to discover hidden treasures, used the magnifying glass to uncover the secrets of nature, gazed through the telescope to witness the wonders of the cosmos, and delved into the book to learn about the mysteries of the universe.\n\nAs Lily's adventures continued, she realized that the magic backpack was more than just a collection of enchanted items. It was a symbol of her own limitless potential and the power of her imagination. It taught her that with curiosity, courage, and a touch of magic, anything was possible.\n\nNews of Lily's magical backpack spread throughout the town, and soon, children from all around came to her, eager to learn about its wonders. Lily welcomed them with open arms, sharing her stories and inspiring them to embark on their own adventures.\n\nAnd so, the magic backpack became a beacon of hope and wonder, reminding everyone that the world is full of hidden treasures waiting to be discovered, if only one has the courage to step into the unknown."

By default, the model returns a response after completing the entire generation process. You can achieve faster interactions by not waiting for the entire result, and instead use streaming to handle partial results.

 
!curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:streamGenerateContent?key=${API_KEY} \
       
-H 'Content-Type: application/json' \
       
--no-buffer \
       
-d '{ "contents":[{"parts":[{"text": "Write long a story about a magic backpack."}]}]}' \
       
2> /dev/null | grep "text"
 
"text": "In the bustling city of Meadow brook, lived a young girl named Sophia with an"
            "text": " insatiable curiosity that knew no bounds. One sunny morning, as she walked to school, she came across a charming little shop tucked away on a side street. Int"
            "text": "rigued, she stepped inside and was immediately captivated by the mystical aura that enveloped the room. Amidst the shelves lined with ancient books and curious trinkets, she stumbled upon a peculiar backpack. Crafted from deep emerald leather and adorned with shimmering crystals, it seemed to pulse with a hidden energy. Unable to resist its allure"
            "text": ", Sophia reached out and touched the backpack, and in that moment, a powerful connection was forged. As if awakening from a long slumber, the backpack emitted a soft glow, revealing its extraordinary properties.\n\nSophia discovered that this was no ordinary backpack. It possessed the magical ability to grant her wishes, but only if they were made with a pure heart and genuine intentions. Overwhelmed with excitement and responsibility, Sophia pondered deeply about how she would use this extraordinary gift. She decided that her first wish would be to make her grandmother, who lived far away, feel close to her. With a heartfelt desire, she whispered her wish to the backpack"

When using long prompts, it might be useful to count tokens before sending any content to the model.

 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:countTokens?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "contents": [{
        "parts":[{
          "text": "Write a story about a magic backpack."}]}]}' > response.json
 
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   127    0    23  100   104    105    477 --:--:-- --:--:-- --:--:--   585
 
cat response.json
 
{
  "totalTokens": 8
}

Embedding is a technique used to represent information as a list of floating point numbers in an array. With Gemini, you can represent text (words, sentences, and blocks of text) in a vectorized form, making it easier to compare and contrast embeddings. For example, two texts that share a similar subject matter or sentiment should have similar embeddings, which can be identified through mathematical comparison techniques such as cosine similarity.

Use the embedding-001 model with either embedContents or batchEmbedContents:

 
curl https://generativelanguage.googleapis.com/v1beta/models/embedding-001:embedContent?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
        "model": "models/embedding-001",
        "content": {
        "parts":[{
          "text": "Write a story about a magic backpack."}]} }' 2> /dev/null | head
 
{
  "embedding": {
    "values": [
      0.008624583,
      -0.030451821,
      -0.042496547,
      -0.029230341,
      0.05486475,
      0.006694871,
      0.004025645,
 
curl https://generativelanguage.googleapis.com/v1beta/models/embedding-001:batchEmbedContents?key=$API_KEY \
    -H 'Content-Type: application/json' \
    -X POST \
    -d '{
      "requests": [{
        "model": "models/embedding-001",
        "content": {
        "parts":[{
          "text": "Write a story about a magic backpack."}]} }]}' 2> /dev/null | head
 
{
  "embeddings": [
    {
      "values": [
        0.008624583,
        -0.030451821,
        -0.042496547,
        -0.029230341,
        0.05486475,
        0.006694871,

If you GET a model’s URL, the API uses the get method to return information about that model such as version, display name, input token limit, etc.

 
curl https://generativelanguage.googleapis.com/v1beta/models/gemini-pro?key=$API_KEY
 
{
  "name": "models/gemini-pro",
  "version": "001",
  "displayName": "Gemini Pro",
  "description": "The best model for scaling across a wide range of tasks",
  "inputTokenLimit": 30720,
  "outputTokenLimit": 2048,
  "supportedGenerationMethods": [
    "generateContent",
    "countTokens"
  ],
  "temperature": 0.9,
  "topP": 1,
  "topK": 1
}

If you GET the models directory, it uses the list method to list all of the models available through the API, including both the Gemini and PaLM family models.

 
curl https://generativelanguage.googleapis.com/v1beta/models?key=$API_KEY
 
{
  "models": [
    {
      "name": "models/chat-bison-001",
      "version": "001",
      "displayName": "Chat Bison",
      "description": "Chat-optimized generative language model.",
      "inputTokenLimit": 4096,
      "outputTokenLimit": 1024,
      "supportedGenerationMethods": [
        "generateMessage",
        "countMessageTokens"
      ],
      "temperature": 0.25,
      "topP": 0.95,
      "topK": 40
    },
    {
      "name": "models/text-bison-001",
      "version": "001",
      "displayName": "Text Bison",
      "description": "Model targeted for text generation.",
      "inputTokenLimit": 8196,
      "outputTokenLimit": 1024,
      "supportedGenerationMethods": [
        "generateText",
        "countTextTokens",
        "createTunedTextModel"
      ],
      "temperature": 0.7,
      "topP": 0.95,
      "topK": 40
    },
    {
      "name": "models/embedding-gecko-001",
      "version": "001",
      "displayName": "Embedding Gecko",
      "description": "Obtain a distributed representation of a text.",
      "inputTokenLimit": 1024,
      "outputTokenLimit": 1,
      "supportedGenerationMethods": [
        "embedText",
        "countTextTokens"
      ]
    },
    {
      "name": "models/embedding-gecko-002",
      "version": "002",
      "displayName": "Embedding Gecko 002",
      "description": "Obtain a distributed representation of a text.",
      "inputTokenLimit": 2048,
      "outputTokenLimit": 1,
      "supportedGenerationMethods": [
        "embedText",
        "countTextTokens"
      ]
    },
    {
      "name": "models/gemini-pro",
      "version": "001",
      "displayName": "Gemini Pro",
      "description": "The best model for scaling across a wide range of tasks",
      "inputTokenLimit": 30720,
      "outputTokenLimit": 2048,
      "supportedGenerationMethods": [
        "generateContent",
        "countTokens"
      ],
      "temperature": 0.9,
      "topP": 1,
      "topK": 1
    },
    {
      "name": "models/gemini-pro-vision",
      "version": "001",
      "displayName": "Gemini Pro Vision",
      "description": "The best image understanding model to handle a broad range of applications",
      "inputTokenLimit": 12288,
      "outputTokenLimit": 4096,
      "supportedGenerationMethods": [
        "generateContent",
        "countTokens"
      ],
      "temperature": 0.4,
      "topP": 1,
      "topK": 32
    },
    {
      "name": "models/gemini-ultra",
      "version": "001",
      "displayName": "Gemini Ultra",
      "description": "The most capable model for highly complex tasks",
      "inputTokenLimit": 30720,
      "outputTokenLimit": 2048,
      "supportedGenerationMethods": [
        "generateContent",
        "countTokens"
      ],
      "temperature": 0.9,
      "topP": 1,
      "topK": 32
    },
    {
      "name": "models/embedding-001",
      "version": "001",
      "displayName": "Embedding 001",
      "description": "Obtain a distributed representation of a text.",
      "inputTokenLimit": 2048,
      "outputTokenLimit": 1,
      "supportedGenerationMethods": [
        "embedContent",
        "countTextTokens"
      ]
    },
    {
      "name": "models/aqa",
      "version": "001",
      "displayName": "Model that performs Attributed Question Answering.",
      "description": "Model trained to return answers to questions that are grounded in provided sources, along with estimating answerable probability.",
      "inputTokenLimit": 7168,
      "outputTokenLimit": 1024,
      "supportedGenerationMethods": [
        "generateAnswer"
      ],
      "temperature": 0.2,
      "topP": 1,
      "topK": 40
    }
  ]
}

The post Quickstart: Get started with Gemini using the REST API first appeared on Striver Technosoft.

]]>
Are bugs and slow delivery ok? http://www.strivertech.com/are-bugs-and-slow-delivery-ok/?utm_source=rss&utm_medium=rss&utm_campaign=are-bugs-and-slow-delivery-ok Thu, 01 Feb 2024 06:52:32 +0000 https://www.strivertech.com/?p=6949 Are bugs and slow delivery ok? The majority of the IT industry operates with low-quality development and survives. However, there are companies where quality is not an option. High quality is NOT for everyone. Does it make sense for your company? We’ve compiled a checklist of questions to find out the answer. 95% of companies […]

The post Are bugs and slow delivery ok? first appeared on Striver Technosoft.

]]>

Are bugs and slow delivery ok?

The majority of the IT industry operates with low-quality development and survives. However, there are companies where quality is not an option.

High quality is NOT for everyone.

Does it make sense for your company?

We’ve compiled a checklist of questions to find out the answer.

Navigating the Quality Quandary: The Impact of Bugs and Slow Delivery

95% of companies can survive with low quality

Quality standards in the software development industry are generally quite low. Quality is a nice-to-have, something on the wishlist. But quality is not a must-have. The following are some symptoms that you don’t need high quality:

  • Bugs are ok. When a bug occurs, the impact is small. There isn’t any major financial loss no reputation loss no legal/regulatory risk.

  • Slow bug fix delivery is ok. If the bug fix gets delivered in a week or month, it doesn’t matter that much. It can wait. There isn’t much of a loss.

  • Slow feature delivery is ok. It doesn’t matter if new features are delivered rarely. Business complains and wants faster, but they accept the slowness.

  • Wasting time is ok. Developers spend most of their day manually debugging the code and fixing regression bugs – it’s ok.

  • Burnout is ok. The team is working overtime, facing stress and health problems. Delivery is unsustainable. More mistakes are made. But, it’s ok. When the team gets burned out, the developers can be replaced.

5% of companies can NOT compromise on quality

The following are some industries where high-quality standards are NOT optional. Quality is not a choice. Examples include:
 
  • Financial Services & Payments Processing

  • Manufacturing & Industrial Automation

  • Logistics, Warehouse & Retail

What’s the impact:

  • Bugs are NOT ok. Even one bug has a high cost. The cost may involve financial losses, and reputation losses – leading to loss of customers, hence revenue loss as well as lawsuits.

  • Slow bug fix delivery is NOT ok. In case a bug is discovered in production, the customer expects a fix ASAP. Every minute that passes by is costly.

  • Slow feature delivery is NOT ok. The market is competitive. When the business has high-priority features, they don’t want to wait for months to release.

  • Wasting time is NOT ok. The company does not want the team to do repetitive manual work. It is unacceptable to spend most of the day debugging and fixing regression bugs when that could be prevented through automated tests.

  • Burnout is NOT ok. The company’s product is so critical, that sustainable delivery must be ensured. Heroism and firefighting are not an option.

Should you invest in software quality?

For 95% of companies, the answer is: No.

These companies survive fine with low quality, there is NO business incentive to invest in quality at all. Quality will just remain a nice-to-have, but low on the priority list. Sometimes the company may invest in technical improvements – but they will remain as just wishlists and no actual change will occur.

For 5% of companies, the answer is: Yes.

These companies can NOT compromise on quality. Either the company will ensure high quality standards or the business will close down. There is no choice. Quality is a must-have. This means there is a business imperative for quality.

Unlocking Quality Software in 2024: A Striver Solution

Q: How can companies in the 5% bracket ensure top-notch software quality?

A: Striver offers a direct route! Skip the trial-and-error phase with our tailored Technical Coaching. Transform your real product in months, not years.

🚀 Connect with Striver for Quality Software Products! Launch your MVP and ensure a bug-free product.

✉ Contact us at info@strivertech.com.

Are bugs and slow delivery ok?

The post Are bugs and slow delivery ok? first appeared on Striver Technosoft.

]]>
Unlock Success with React Native: Best Practices by Striver http://www.strivertech.com/unlock-success-with-react-native-best-practices-by-striver/?utm_source=rss&utm_medium=rss&utm_campaign=unlock-success-with-react-native-best-practices-by-striver Wed, 31 Jan 2024 06:54:30 +0000 https://www.strivertech.com/?p=6942 React Native Best Practices Understanding Best Practices in Coding In the coding world, ‘best practices’ refer to guidelines rather than strict rules. While it may seem optional initially, adhering to these suggestions is crucial as your codebase expands. While your code might function adequately without them initially, maintaining its health and readability becomes increasingly challenging […]

The post Unlock Success with React Native: Best Practices by Striver first appeared on Striver Technosoft.

]]>

React Native Best Practices

Understanding Best Practices in Coding

In the coding world, ‘best practices’ refer to guidelines rather than strict rules. While it may seem optional initially, adhering to these suggestions is crucial as your codebase expands. While your code might function adequately without them initially, maintaining its health and readability becomes increasingly challenging as it grows.

 

Alright, let’s get down to the main point. What are the React Native best practices? Well, they’re a bunch of guidelines that you can follow to create a maintainable codebase. In this article, we’ll go into more detail about these practices.

Are you delving into React Native development and striving for excellence in your mobile app projects? Striver brings you valuable insights and best practices to guide you on your journey to success.

Top 6 React Native Best Practices for 2024

Top 6 React Native Best Practices for 2024
1. Use TypeScript with Your React Native App

TypeScript is a statically typed programming language which means it requires explicitly defining the data types for variables, functions, and other elements. This not only leads to more reliable code but also helps developers catch bugs during the compilation process.

Consider the following to calculate the order price

function calculatePrice(order) {
return order.price + 200;
}

The current code works fine, but it doesn’t tell us much about what properties the order object contains, which could lead further to a crash if we try to access a property that doesn’t exist.

To prevent the crash and enhance readability, we can use TypeScript. TypeScript is a programming language that adds types to JavaScript. This means that we can specify the type of each property in the object, which will help us avoid errors.

interface Order {
price: number;
name: string;
taxPercentage: number;
}
function calculatePrice(order: Order) {
const { price, taxPercentage } = order;
const taxValue = price * taxPercentage;
return price + taxValue;
}

Here is the same function, but now you and your editor are aware of the object properties and their types in code, which makes it easier to extend the functionality.

2. Functional Components over the Class Components

In React Native, you will have two main components: Functional and Class components. But functional components are the way to go in React Native. They’re simpler, more concise, and faster than class components. This makes them easier to read, write, and test. Plus, they can improve your app’s performance.

If you’re not sure what components are, they’re functions that return React elements. So if you’re looking for a way to improve your React Native code, use functional components over class components. They’re the future of React Native development.

Class Component Example

import React, { Component } from 'react';
class ClassComponent extends Component {
constructor(props) {
super(props);
this.state = {
count: 0,
};
}
incrementCount = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<View>
<Text style={styles.h1}>Class Component</Text>
<Text>Count: {this.state.count}</Text>
<Button title='Increment' onPress={this.incrementCount}/>
</View>
);
}
}
export default ClassComponent;

In this class component example, we’re using the Component class from React to create a component. The state is managed within the component’s constructor, and the render method defines the component’s UI.

Functional Component Example

import React, { useState } from 'react';
const FunctionalComponent = () => {
const [count, setCount] = useState(0);
const incrementCount = () => {
setCount(count + 1);
};
return (
<View>
<Text style={styles.h1}>Functional Component</Text>
<Text>Count: {count}</Text>
<Button title='Increment' onPress={incrementCount}/>
</View>
);
};
export default FunctionalComponent;

In this functional component example, we’re using the useState hook from react to manage state. The component is defined as a simple JavaScript function that returns JSX to render the UI.

3. Import your dependencies in order

When you have a bunch of imports in one file, it could be a headache trying to find that one specific import you need if you have not organized your imports properly. Therefore it is essential to order imports invariably.

At the same time, you should also ensure that the dependencies have a proper sequence of imports. If the order is not correct, it can affect how components behave and lead to bugs that are hard to find.

Here’s an example of how you can organize your imports:

  1. External imports — react
  2. Internal imports, like relative paths — ../button
  3. In folder imports like ./styles.ts
  4. The imports may be sorted alphabetically in every group
  5. Every group must be divided by white space
import React from 'react';
import { TouchableOpacity, View } from 'react-native';
import { Button, Card } from '../components'
import { MainLayout } from '../layouts'
import { StyledCard } from './styles.ts'

You can use formatting tools like Eslint and Prettier to automate and enforce the correct import order to avoid such issues.

4. Use Path Alias to avoid long imports

Path aliases are a way to create shorter and more meaningful import paths in your code. This can be helpful when you have a deep or nested folder structure, and it can make your imports easier to read and understand.

For example, instead of writing a long import like this:

import { IconButton } from '../../components/buttons';
import { CircleButton } from 'components/buttons';
OR
import { CircleButton } from 'buttons';

Here’s how to use path aliases in both TypeScript and React Native to create shorter and more meaningful import paths in your code.

Here’s how to use path aliases in both TypeScript and React Native to create shorter and more meaningful import paths in your code.

  1. Path Alias in TypeScript
  • Create or update the tsconfig.json file in your project if it doesn’t exist already.
  • Set the baseUrl to . , which represents the root of the directory. This sets the starting point for all path aliases.
  • Add path aliases to the paths object. In this example, we have two path aliases defined:
// tsconfig.json
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
// Path alias config
"baseUrl": ".",
"paths": {
// This needs to be mirrored in babel.config.js
// Components is a directory with sub directories
"components/*": ["src/components/*"],
// We want to expose the exports of the buttons index file
"buttons": ["src/components/buttons/index"]
}
}
}

Now, TypeScript will be able to understand and parse the following imports:

import { CircleButton } from "components/buttons"
import { CircleButton } from "buttons"

2. React Native Path Alias

First, install the babel-plugin-module-resolver as a developer dependency

yarn add - dev babel-plugin-module-resolver
npm install babel-plugin-module-resolver - save-dev

Now we can update the babel.config.js file to use the **module-resolver**plugin and point to our directories.

**// babel.config.js**
module.exports = function (api) {
api.cache(true)
return {
presets: ["babel-preset-expo"],
plugins: [
[
"module-resolver",
{
alias: {
// This needs to be mirrored in tsconfig.json
components: "./src/components",
buttons: "./src/components/buttons",
},
},
],
],
}
}
5. Create Responsive Layout in Your React Native App

Responsive style properties in React refer to the use of functions to create an adaptive user interface or a layout that adjusts to various screen sizes and orientations. Developing a responsive React Native app can be done in multiple ways, and one of them is by using react-native-normalize. This handy library offers functions that help you create responsive layouts effortlessly.

6. Implement Crash Analytics Tools

Crash analytics tools are like your magic tools that keep an eye on your app 24/7. They do real-time monitoring to help you identify crashes and errors. These tools analyze the crash data and give you the lowdown on what’s causing the chaos.

So, if you’re in the development process, and suddenly, the app crashes out of the blue. With the implementation of crash analytics, you can easily find the root causes of these crashes.

There are a bunch of awesome crash analytics tools out there, like Sentry, Firebase, Crashlytics, and more. They’re like your trusty companions, helping you debug and rescue your app from potential crashes.

Dive Deeper with Striver

For an in-depth exploration of these React Native best practices and more, read our featured blog on Medium: React Native Best Practices by Striver.

At Striver, we are committed to empowering developers and businesses with the knowledge and expertise needed to excel in the dynamic world of React Native development. Stay tuned for more insightful content, and let’s shape the future of mobile app development together.

Ready to elevate your React Native projects? Connect with Striver, your trusted partner in innovative software solutions.

 

🚀💻 #ReactNative #MobileAppDevelopment #BestPractices #StriverTech #SoftwareDevelopment #TechInnovation

The post Unlock Success with React Native: Best Practices by Striver first appeared on Striver Technosoft.

]]>
A Guide to Open Source OpenAPI Comment Parser http://www.strivertech.com/a-guide-to-open-source-openapi-comment-parser/?utm_source=rss&utm_medium=rss&utm_campaign=a-guide-to-open-source-openapi-comment-parser Fri, 01 Dec 2023 04:04:57 +0000 https://www.strivertech.com/?p=6907 Document APIs with open source OpenAPI Comment Parser Generate the OpenAPI spec from the comments line with your code Whether you’re building an application or website, great documentation is crucial to the success of your service. Developers need instructions on how to use your API, and they need a way to try it out. Good […]

The post A Guide to Open Source OpenAPI Comment Parser first appeared on Striver Technosoft.

]]>

Document APIs with open source OpenAPI Comment Parser

Generate the OpenAPI spec from the comments line with your code

Whether you’re building an application or website, great documentation is crucial to the success of your service. Developers need instructions on how to use your API, and they need a way to try it out. Good documentation handles both.

The OpenAPI Specification is an open standard for defining and documenting your API. The OpenAPI Specification enables the generation of great documentation, but creating an OpenAPI spec takes a lot of time and effort to create and keep up-to-date. Often, the OpenAPI spec ends up a large, forgotten, thousand-line file.

To help make it as easy as possible to document an API, today we are launching the OpenAPI Comment Parser. The goal of OpenAPI Comment Parser is to give developers a way to generate this OpenAPI spec from comments inline with their code. When the OpenAPI spec lives inside the code, developers are much more likely to keep it up-to-date as their code changes.

This approach brings the OpenAPI spec to the code. It gets broken up into smaller, more manageable pieces. It lives next to the code that it’s describing. This enables developers to easily update the relevant spec when code changes and don’t have to go searching in the giant spec file. We are also introducing a new spec format that is tailor-made for being written in comments. On average, this new format has been shown to reduce the amount of spec needed to be written by 50 percent.

The library is built for Node.js, but the CLI can work with any language that uses this style of comments:

Whether you’re building an application or website, great documentation is crucial to the success of your service. Developers need instructions on how to use your API, and they need a way to try it out. Good documentation handles both.

The OpenAPI Specification is an open standard for defining and documenting your API. The OpenAPI Specification enables the generation of great documentation, but creating an OpenAPI spec takes a lot of time and effort to create and keep up-to-date. Often, the OpenAPI spec ends up a large, forgotten, thousand-line file.

To help make it as easy as possible to document an API, today we are launching the OpenAPI Comment Parser. The goal of OpenAPI Comment Parser is to give developers a way to generate this OpenAPI spec from comments in line with their code. When the OpenAPI spec lives inside the code, developers are much more likely to keep it up-to-date as their code changes.

This approach brings the OpenAPI spec to the code. It gets broken up into smaller, more manageable pieces. It lives next to the code that it’s describing. This enables developers to easily update the relevant spec when code changes and don’t have to go searching in the giant spec file. We are also introducing a new spec format that is tailor-made for being written in comments. On average, this new format has been shown to reduce the amount of spec needed to be written by 50 percent.

The library is built for Node.js, but the CLI can work with any language that uses this style of comments:

/**
 * GET /users/{userId}
 * @summary Returns a user by ID.
 * @pathParam {int64} userId - The user's ID.
 * @response 200 - OK
 */

We plan on expanding to the most popular languages.

See the OpenAPI Comment Parser in action

In the following video, I walk you through a sample scenario that shows how to use the OpenAPI Comment Parser to create documentation for a Node.js API.

How can this make a developer’s life easier?

The Comment Parser automatically creates better documentation with less code that is more manageable. On top of these improvements, developers writing the API can use the documentation generated from the Comment Parser to test their API. This means less time waiting for a frontend to be built or having to rely on other tools in order to test drive their API.

Try it today

We built this tool to solve some of the problems we face everyday developing services at Striver. Now, developers can try out the new tool on GitHub.

 

Get the code

The post A Guide to Open Source OpenAPI Comment Parser first appeared on Striver Technosoft.

]]>
🃏RummyPokerWin: The Ultimate Fusion of Rummy and Poker Games | Case Study 🎮 http://www.strivertech.com/rummypokerwin-the-ultimate-fusion-of-rummy-and-poker-games-case-study/?utm_source=rss&utm_medium=rss&utm_campaign=rummypokerwin-the-ultimate-fusion-of-rummy-and-poker-games-case-study Wed, 21 Jun 2023 06:24:34 +0000 https://www.strivertech.com/?p=6742 RummyPokerWin: Combining the Best of Rummy and Poker 🃏RummyPokerWin: The Ultimate Fusion of Rummy and Poker Games | Case Study 🎮 In this case study, we delve into the world of RummyPokerWin, an innovative mobile gaming app that combines the thrill of Rummy and Poker games. With the use of Flutter and Node.js WebSocket technology, […]

The post 🃏RummyPokerWin: The Ultimate Fusion of Rummy and Poker Games | Case Study 🎮 first appeared on Striver Technosoft.

]]>

RummyPokerWin: Combining the Best of Rummy and Poker

🃏RummyPokerWin: The Ultimate Fusion of Rummy and Poker Games | Case Study 🎮

In this case study, we delve into the world of RummyPokerWin, an innovative mobile gaming app that combines the thrill of Rummy and Poker games. With the use of Flutter and Node.js WebSocket technology, RummyPokerWin provides an unparalleled gaming experience for enthusiasts of both card games.

🃏🎉

Building an Immersive Gameplay Experience:

RummyPokerWin offers an interactive gameplay experience that captivates users from the moment they launch the app. Leveraging the power of Flutter, the app boasts a sleek and intuitive user interface, complemented by smooth animations that enhance the overall gaming experience.

🕹💥

Real-Time Multiplayer Matches:

One of the key highlights of RummyPokerWin is its real-time multiplayer mode. Players can challenge their friends or compete with users from around the world, engaging in thrilling head-to-head matches. With the integration of Node.js WebSocket technology, the app ensures seamless and synchronized gameplay, fostering intense competition and strategic discussions.

🌍🎮

Enhancing Social Interactions:

The in-app chat feature in RummyPokerWin enables players to connect and interact with each other. It creates a sense of community, allowing for strategic discussions, sharing tips, and building friendships among players. The app becomes more than just a game—it becomes a platform for social engagement.

💬🤝

Secure Transactions and Virtual Currency:

RummyPokerWin places a strong emphasis on secure transactions. Players can confidently deposit and withdraw virtual currency within the app, ensuring a safe and reliable gaming experience. This feature enhances user trust and encourages active participation in the app’s ecosystem.

💰🔒

Real-Time Updates and Achievements:

Keeping players engaged and informed is a priority for RummyPokerWin. Real-time updates notify users about the latest game developments, including upcoming tournaments and events. The app also includes leaderboards and achievements, allowing players to showcase their skills, climb the ranks, and unlock various milestones.

🏆🌟

Conclusion:

RummyPokerWin stands as a testament to the power of Flutter and Node.js WebSocket technology in creating a unique and immersive gaming experience. By combining the best aspects of Rummy and Poker games, the app appeals to a wide range of card game enthusiasts. With its seamless gameplay, real-time multiplayer matches, and secure transactions, RummyPokerWin has established itself as a top choice for gamers seeking excitement and entertainment on their mobile devices.

🃏🎉

Read our case study to learn more about RummyPokerWin and its journey toward becoming a leading mobile gaming app that has captivated players worldwide.

#CaseStudy #RummyPokerWin #Flutter #NodeJS #MobileGaming #Rummy #Poker #Innovation #GamingExperience

The post 🃏RummyPokerWin: The Ultimate Fusion of Rummy and Poker Games | Case Study 🎮 first appeared on Striver Technosoft.

]]>
How to Choose The Right Mobile App Development Company? http://www.strivertech.com/how-to-choose-the-right-mobile-app-development-company/?utm_source=rss&utm_medium=rss&utm_campaign=how-to-choose-the-right-mobile-app-development-company Wed, 19 Apr 2023 11:58:48 +0000 https://www.strivertech.com/?p=6627 How to Choose The Right Mobile App Development Company? Choose an app development company that aligns with your goals and values. Mobile apps have become an essential part of our daily lives, from entertainment to productivity and everything in between. With the increasing demand for mobile apps, the competition in the market has grown tremendously. […]

The post How to Choose The Right Mobile App Development Company? first appeared on Striver Technosoft.

]]>
How to Choose The Right Mobile App Development Company?

Choose an app development company that aligns with your goals and values.

Mobile apps have become an essential part of our daily lives, from entertainment to productivity and everything in between. With the increasing demand for mobile apps, the competition in the market has grown tremendously. To stay ahead in the game, businesses need to develop high-quality mobile apps that offer exceptional user experience. However, not all businesses can develop a mobile app in-house. This is where mobile app development companies come into play.

Choosing the right mobile app development company is crucial for the success of your mobile app. The wrong choice can waste time, money, and resources, ultimately leading to a failed project. In this article, we’ll discuss how to choose the right mobile app development company for your business.

1. Define Your Requirements

Before choosing a mobile app development company, you need to define your requirements. Determine what you want to achieve with your mobile app, the features you want to include, and the target audience. Having a clear understanding of your requirements will help you choose a company that can meet your needs.

2. Expertise and Experience

The first and most important factor to consider when choosing a mobile app development company is their expertise and experience. You need to ensure that the company you choose has a team of skilled and experienced developers who can deliver high-quality mobile apps. Look for companies that have experience in developing mobile apps in your industry or niche. For example, if you want to develop a healthcare app, look for a company that has experience in developing healthcare apps.

3. Portfolio

The portfolio of a mobile app development company is a reflection of their work. It gives you an idea of the type of apps they have developed in the past, their design skills, and their ability to deliver projects on time. Look for companies that have a strong portfolio of mobile apps that are similar to your project. Check the reviews and ratings of their apps on the app store to get an idea of user satisfaction.

4. Communication and Support

Communication is key to the success of any project. When choosing a mobile app development company, look for a company that has a clear and transparent communication process. They should be able to provide you with regular updates on the progress of your project. Also, make sure that the company offers post-launch support and maintenance services.

5. Pricing and Budget

The cost of developing a mobile app can vary depending on the complexity of the project and the hourly rates of the development company. Look for a company that offers a transparent pricing model and can provide you with a detailed estimate of the cost of the project. However, do not compromise on the quality of the app for the sake of saving costs.

6. Technology Stack

The technology stack used by a mobile app development company can have a significant impact on the quality and performance of the app. Look for companies that use the latest and proven technologies to develop mobile apps. For example, if you want to develop a native iOS app, look for a company that has expertise in Swift programming language.

Example: Let’s say you want to develop a fitness app. Look for a mobile app development company that has experience in developing fitness apps, has a strong portfolio of similar apps, uses the latest technologies, has transparent communication and support, and offers a transparent pricing model.

In conclusion, choosing the right mobile app development company is crucial for the success of your project. Consider the expertise and experience, portfolio, communication and support, cost, and technology stack when choosing a mobile app development company. Make sure to do thorough research, ask for references, and read reviews before making a final decision.

The post How to Choose The Right Mobile App Development Company? first appeared on Striver Technosoft.

]]>
No-Code/Low-Code Revolution http://www.strivertech.com/no-code-low-code-revolution/?utm_source=rss&utm_medium=rss&utm_campaign=no-code-low-code-revolution Tue, 28 Mar 2023 09:19:55 +0000 https://www.strivertech.com/?p=6359 Is No-Code/Low-Code Future of App Development? In recent years, the rise of no-code/low-code platforms has revolutionized app development. These platforms allow developers to create complex applications with little to no coding, making the development process faster and more accessible to non-technical users. However, the rise of no-code/low-code platforms has raised concerns about the future of […]

The post No-Code/Low-Code Revolution first appeared on Striver Technosoft.

]]>

Is No-Code/Low-Code Future of App Development?

In recent years, the rise of no-code/low-code platforms has revolutionized app development. These platforms allow developers to create complex applications with little to no coding, making the development process faster and more accessible to non-technical users. However, the rise of no-code/low-code platforms has raised concerns about the future of traditional development jobs. Will these platforms replace traditional development jobs altogether?

This blog explores the rise of no-code/low-code platforms and their implications on traditional development jobs.

No-Code/Low-Code Platforms: The Future of Coding?
What are No-Code/Low-Code Platforms?

No-code/low-code platforms are software development tools that allow developers to create applications without writing code. These platforms use drag-and-drop interfaces, pre-built templates, and visual workflows to create applications quickly and efficiently. No-code/low-code platforms are designed to be user-friendly, so even non-technical users can easily create applications.

The Rise of No-Code/Low-Code Platforms

The rise of no-code/low-code platforms has been driven by the need for faster and more accessible app development. With traditional development methods, creating complex applications can be time-consuming and require a high level of technical expertise. No-code/low-code platforms have made app development more accessible to non-technical users, enabling them to create complex applications quickly and easily. These platforms have also reduced the time and cost associated with app development, making it more affordable for small businesses and startups.

 

Traditional development tech
Implications for Traditional Development Jobs

The rise of no-code/low-code platforms has raised concerns about the future of traditional development jobs. While these platforms have made app development more accessible, they may also replace traditional development jobs. As more businesses adopt no-code/low-code platforms, the demand for conventional development jobs may decrease. However, there is also a need for developers who can customize and extend no-code/low-code platforms to meet specific business needs. This means that traditional development jobs may shift towards more specialized roles that require a higher level of technical expertise.

Pros and Cons

Moreover, no-code/low-code platforms offer increased flexibility in app development. Developers can quickly adapt to changing business needs and user requirements, making staying ahead of the competition easier. These platforms also allow non-technical users to build basic applications, enabling businesses to create custom solutions that meet their unique needs.

Despite these benefits, no-code/low-code platforms also have some drawbacks. The biggest concern is the potential for lower-quality code and security vulnerabilities due to the lack of coding knowledge required. Additionally, there may be limitations in terms of functionality and customization, as pre-built templates can be restrictive.

Another issue is the risk of job displacement. Some fear that the rise of no-code/low-code platforms could eventually replace traditional development jobs. However, this is unlikely to happen in the near future. While these platforms can help reduce the need for developers in certain areas, experienced developers will still need to handle more complex tasks.

Example:

Let’s take a look at an example of how no-code/low-code platforms are being used in the real world. Consider a small business owner who wants to create a mobile app to help manage their customer database. Instead of hiring a development team or outsourcing the project, they can use a no-code/low-code platform to create the app themselves. Using a pre-built template, they can design the app, add functionality, and launch it in a matter of days or weeks, without the need for extensive coding knowledge.

To summarize, here are the pros and cons of no-code/low-code platforms in app development for start-ups:

 

Pros:

* Faster app development

* Reduced costs

* Increased flexibility

* Custom solutions

* Enables non-technical users to create basic applications

Cons:

* Potential for lower-quality code and security vulnerabilities

* Limitations in functionality and customization

* Risk of job displacement

* Long-term costs of maintaining and updating applications

Conclusion:
The rise of no-code/low-code platforms has revolutionized app development, making it more accessible and affordable for businesses of all sizes. While these platforms may replace some traditional development jobs, they also offer new opportunities for developers who can customize and extend these platforms. As technology continues to evolve, it is essential to keep up with the latest trends and developments in the industry to remain relevant and competitive.

The post No-Code/Low-Code Revolution first appeared on Striver Technosoft.

]]>
Roker – Case Study http://www.strivertech.com/roker-case-study/?utm_source=rss&utm_medium=rss&utm_campaign=roker-case-study Thu, 23 Mar 2023 09:32:24 +0000 https://www.strivertech.com/?p=6249 From Concept to Launch: Building an Efficient and User-Friendly Mobile App for Roker- A Case Study In today’s fast-paced world, mobile apps have become an integral part of every business’s success. They provide businesses with a competitive advantage by reaching customers where they are most active – their smartphones. Roker, a leading e-commerce company, approached […]

The post Roker – Case Study first appeared on Striver Technosoft.

]]>

From Concept to Launch: Building an Efficient and User-Friendly Mobile App for Roker- A Case Study

In today’s fast-paced world, mobile apps have become an integral part of every business’s success. They provide businesses with a competitive advantage by reaching customers where they are most active – their smartphones. Roker, a leading e-commerce company, approached Striver Technosoft with the idea of developing a mobile app that would provide its customers with a seamless shopping experience. Striver Technosoft, a renowned software development company, took on the challenge and delivered an efficient and user-friendly mobile app that has since become the backbone of Roker e-commerce strategy.

Here is a detailed case study of how Striver Technosoft developed the Roker mobile app from scratch and successfully delivered it on both the Google Play Store and Apple App Store with its unique features and exceptional user experience.

  1. Understanding Roker Requirements: 

Striver Technosoft’s first step was to understand Roker requirements and goals for the mobile app. The company wanted a mobile app that would offer its customers an easy and convenient way to shop for products online. The app would also provide users with a seamless shopping experience, including features like product search, product recommendations, and easy checkout options.


  2. App Development Strategy:

Striver Technosoft’s app development team adopted an agile development strategy to ensure that the app was delivered on time and within budget. They started by creating a wireframe and a prototype of the app that Roker. could review and approve. Once the prototype was approved, the development team started building the app’s backend and front end, ensuring that the app was scalable, secure, and could handle high traffic.


  3. App Features:

The app was designed with unique features that set it apart from other e-commerce apps. The features included:


  • User-Friendly Interface: The app was designed with a user-friendly interface that made it easy for users to navigate through the app and find the products they were looking for.

  • Search Bar: The app had a search bar that allowed users to search for products using keywords or product names.

  • Product Recommendations: The app provided users with product recommendations based on their search history and buying behavior.

  • Easy Checkout: The app had an easy checkout process that allowed users to quickly make purchases without any hassle.

  • Payment Gateway Integration: The app was integrated with multiple payment gateways, making it easy for users to make payments using their preferred payment method.

  • Push Notifications: The app’s push notification feature allowed Roker. to send promotional messages and updates to its users.

  1. Testing and Deployment:

Before launching the app, Striver Technosoft’s testing team conducted extensive testing to ensure that the app was bug-free, scalable, and performed well under different conditions. Once the app was tested and approved, it was deployed on both the Google Play Store and Apple App Store.


  2. Results:

The Roker mobile app was launched successfully and received positive feedback from its users. The app helped increase Roker sales and revenue, and its customers enjoyed a seamless shopping experience.


Conclusion:

Striver Technosoft’s collaboration with Roker. resulted in the development of a remarkable mobile app that delivers an exceptional user experience to customers. The app’s unparalleled features and ease of use distinguish it from other e-commerce apps. Its successful launch on both app stores has been a significant achievement for both Roker Inc. and Striver Technosoft. We invite you to visit and download the app using the links below and provide us with your valuable feedback.

The post Roker – Case Study first appeared on Striver Technosoft.

]]>