Angular Material vs Bootstrap A Detailed Comparison (1)
For Developers

Angular Material vs Bootstrap: A Detailed Comparison

Angular Material vs Bootstrap, what should you choose as your front-end library? Here’s a detailed comparison between the two. Angular Material is a component.

Great websites have excellent user interfaces and offer a user experience of the highest quality. Front-end tools like Angular Material and Bootstrap are necessary to create a high-functioning and responsive website. So, which is better in the Angular Material vs Bootstrap battle? Can I use Bootstrap for Angular? Is Angular Material good for mobile applications? This blog post will help you answer all these questions. Keep reading.

Table of Contents:

  1. What is Angular Material?
  2. What is Bootstrap?
  3. What is the difference between Angular and Angular Material?
  4. Angular Material vs Bootstrap: Can these two be used together?
  5. Angular Material vs Bootstrap: Let’s compare the two 
  6. Angular Material vs Bootstrap: Practical use cases comparison
  7. Angular Material vs Bootstrap: Which one to choose on the basis of performance and speed?
  8. Angular Material vs Bootstrap: Which one is better for accessibility and internationalization?
  9. Angular Material vs Bootstrap: Which is better? 
  10. FAQs

What is Angular Material?

Angular Material is a user interface module that offers pre-built component collections for frameworks like Vue.js, Angular, and React among others. The Angular Material component library offers components like input sliders, checkboxes, toolbar, site navigation patterns, buttons, and data tables to make responsive websites and applications.

What is Bootstrap?

Bootstrap is an intuitive and open-source CSS framework that helps build attractive web pages and mobile applications. CSS frameworks consist of several ready-to-use stylesheets by web developers. Bootstrap offers an array of HTML and CSS designs and pre-styled components like dropdowns, badges alert, progress bars, and navigation patterns.

What is the difference between Angular and Angular Material?

AngularJS is a JavaScript framework, whereas Angular Material is a User Interface module. Google introduced a design language called Material in 2014 which was later affixed to Angular JS. In 2016, Google built Angular’s code from scratch using Typescript and integrated the design language Material as Angular Material.

Angular Material vs Bootstrap: Can these two be used together?

Can I use Angular Material and Bootstrap together?

Yes, you can use parts of Angular Material and Bootstrap together in the same web or mobile project. Developers need to be careful not to use the same components, which can clash.

Angular Material vs Bootstrap: Let’s compare the two 

Angular Material vs Bootstrap (2)

Angular Material vs Bootstrap

  1. Unique components

    Angular Material and Bootstrap offer a variety of unique components for great website design. The unique components of Angular Material are not found in Bootstrap and vice-versa.

    Angular Material offers unique components like a date picker, slider, grid list, toolbar, icon, snack bar, progress spinner, chips, stepper, and sort header.

    On the other hand, Bootstrap offers unique components like a carousel, collapse, scroll spy, breadcrumb, jumbotron, and popovers.
  2. Card

    In Angular Material and Bootstrap, a card is an entry point for varying items like photos, text, and links for UI design. The card serves as a container for different items related to a single subject.

    Bootstrap offers different color options, whereas Angular Material provides a plain card.
  3. Dialog or Modal

    Dialogs in Angular Material or Modals in Bootstrap refer to plugins that help users add information or choose from multiple options.

    In Angular Material, dialogs help edit present data to pass it to the dialog component. The dialog configuration object utilizes the data property to pass the data.

    Bootstrap uses modals that offer customizable, responsive pop-ups and lightboxes. Videos, alerts, images, and animations can be inside modals.
  4. Menu or Navbar

    Menu in Angular Material or Navbar in Bootstrap help builds effective navigation for your website or mobile application.

    Angular Material offers a menu that contains an extensive toolbar and an exceptional sidebar. Developers can attach the menu with different controls and utilize styling and animation options as required.

    Navbar in Bootstrap is a collapsible and extendable item that can do so as per the screen size. Developers who want to achieve responsive navigation can do so easily with Navbar.
  5. Expansion panel

    The expansion panel displays the content summary inside the panel. Developers can choose the content and design format of the panel.

    The Expansion Panel in Angular Material is according to the latest user interface design and presents a complete summary to users.

    In Bootstrap, the expansion panel is in a collapsible format that needs some CSS styling improvements to be in sync with the latest design.
  6. Application architecture

    Application architecture refers to the tools, patterns, and designs that help you build and design an application.

    Angular Material offers a layered architecture with all components attached to core functionalities. Developers can choose single components or bundle components together for their applications.

    Bootstrap architecture is a view-view-controller type as it uses two components namely the logic layer and the view layer. Developers can choose from the twelve components of the logic layer and the six modules of the view layer.  Also, Bootstrap supports the MVC architecture design pattern for web pages.
  7. Responsive-oriented approach

    In the responsive-oriented approach, the website design goes through dynamic changes as per the screen size and device orientation.

    Bootstrap supports a responsive-oriented approach, whereas Angular Material does not support a responsive design approach.

Angular Material vs Bootstrap: Practical use cases comparison

Bootstrap and Angular Material are both powerful frameworks, each with its own strengths and ideal use cases. Understanding the practical scenarios where these frameworks excel can help remote software developers make informed decisions when choosing the right tool for their projects.

  1. E-commerce Platforms:

    When to use Bootstrap: Bootstrap’s large library of pre-built components and responsive grid structure make it a good choice for creating e-commerce platforms. Its ready-to-use UI elements, such as navigation menus, carousels, and forms, are simply customizable to meet the branding and design needs of online retailers.

    When to use Angular Material: Angular Material’s material design philosophy and pre-designed components provide a visually appealing and consistent user interface for e-commerce platforms. Its user interface components, including as cards, menus, and sliders, have a modern look and feel, which improves the user experience.
  2. Content Management Systems (CMS):

    When to use Bootstrap: Bootstrap’s flexibility and modular approach make it well-suited for developing content management systems. Its grid system allows developers to create responsive layouts that adapt to various screen sizes, providing an optimal viewing experience for managing and displaying content.

    When to use Angular Material: Angular Material’s clean and intuitive design language makes it an ideal choice for building content management systems interfaces. Its cohesive set of components, such as tables, forms, and dialog boxes, streamline the content management process and contribute to a seamless user experience.
  3. Data Visualization Tools:

    When to use Bootstrap: Bootstrap can be leveraged to create visually appealing and interactive data visualization tools. Its responsive grid system combined with custom CSS and JavaScript libraries, such as D3.js or Chart.js, allows developers to build dynamic charts, graphs, and dashboards that effectively communicate complex data.

    When to use Angular Material: Angular Material’s robust set of UI components, including charts and data tables, simplify the development of data visualization tools. With Angular Material, developers can easily incorporate interactive visualizations and data-driven components into their applications.
  4. Enterprise Applications:

    When to use Bootstrap: Bootstrap’s extensive community support and availability of themes make it a popular choice for developing enterprise applications. Its wide range of components and plugins, coupled with its responsive design, enable the creation of feature-rich and user-friendly interfaces for various enterprise needs, such as dashboards, CRM systems, or project management tools.

    When to use Angular Material: Angular Material’s modular architecture and consistent design language make it well-suited for building enterprise applications with complex workflows. Its comprehensive set of components, like data tables, form controls, and modals, provide a cohesive user experience and can be easily customized to meet specific business requirements.

By considering these practical use cases, remote software developers can evaluate whether Bootstrap or Angular Material is the more suitable framework for their particular project requirements. It is important to assess factors such as design flexibility, component ecosystem, performance, and community support when making the decision, ultimately ensuring the successful implementation of the chosen framework.

Angular Material vs Bootstrap: Which one to choose on the basis of performance and speed?

Angular Material vs Bootstrap (3)

Angular Material vs Bootstrap: Performance and speed

Several aspects come into play when comparing the performance and loading time of Bootstrap vs Angular Material, which can affect the overall speed and efficiency of a website. Here are some essential factors to consider while comparing the performance of both frameworks:

  • File Size: The size of each framework’s CSS and JavaScript files can have a considerable impact on loading speeds. Bootstrap includes a large number of CSS and JavaScript files that span a wide variety of components and functionalities. Angular Material, on the other hand, takes a more modular approach, allowing developers to include only the components that are required, lowering total file size.
  • Network Requests: The number of network requests required to fetch CSS, JavaScript, and other assets affects the loading speed. Bootstrap typically requires separate requests for each CSS and JavaScript file, while Angular Material can be bundled and optimized using build tools like Angular CLI, resulting in fewer network requests.
  • Rendering Efficiency: The rendering efficiency of the frameworks can impact the time it takes to render the user interface and make it interactive. Angular Material is built specifically for Angular applications, leveraging the power of Angular’s change detection and optimization mechanisms, which can lead to efficient rendering. Bootstrap, being a more general-purpose framework, may not have the same level of optimization for rendering efficiency.
  • Caching: Browser caching can improve subsequent page loads by storing static assets locally. Both Bootstrap and Angular Material can take advantage of browser caching, allowing returning users to experience faster load times after the initial visit.

    Also, read Cache-Control Headers and Their Use Cases You Must Know! 
  • Minification and Compression: Minifying and compressing CSS and JavaScript files can significantly reduce their size, resulting in faster loading times. Both Bootstrap and Angular Material offer minified versions of their files, which should be used in production to optimize performance.

It’s important to note that the actual performance and loading speed of a web application built with Bootstrap or Angular Material depends on various factors, including the specific implementation, server configuration, network conditions, and the overall complexity of the application.

To determine which framework performs better in a specific scenario, it is recommended to conduct performance tests using tools like Lighthouse, PageSpeed Insights, or web browser developer tools. These tools can provide insights into metrics such as First Contentful Paint (FCP), Time to Interactive (TTI), and Total Blocking Time (TBT), giving a more accurate comparison of performance between Bootstrap and Angular Material.

Also, read: What Is Cross-Browser Compatibility Testing? What Are Its Best Practices? 

Angular Material vs Bootstrap: Which one is better for accessibility and internationalization?

Angular Material vs Bootstrap Accessibility and Internationalization comparison

Angular Material vs Bootstrap accessibility and Internationalization comparison

When comparing Bootstrap and Angular Material in terms of accessibility and internationalization, it’s essential to consider the features and support offered by each framework to create inclusive and globally accessible web applications. Here’s a comparison of both frameworks in these aspects:

Accessibility:

  • Accessibility Guidelines: Bootstrap follows the Web Content Accessibility Guidelines (WCAG) 2.0 standards and strives to ensure its components are accessible. It provides appropriate ARIA (Accessible Rich Internet Applications) roles, attributes, and keyboard navigation support for interactive elements. However, the level of accessibility compliance may vary depending on how components are customized and implemented.
  • Angular Material Accessibility: Angular Material also aims to meet WCAG 2.0 standards and provides accessibility features out of the box. It includes ARIA support, keyboard navigation, and adheres to high contrast and color contrast standards. Angular Material components have built-in accessibility features, but developers should ensure proper usage and configuration.
  • Keyboard Navigation: Both frameworks support keyboard navigation for users who rely on assistive technologies or have motor disabilities. Bootstrap provides basic keyboard navigation for its components, while Angular Material emphasizes keyboard accessibility by incorporating focus management and intuitive navigation within components.
  • Customization and ARIA Attributes: Both frameworks allow customization of their components, which gives developers the flexibility to apply appropriate ARIA attributes and ensure proper accessibility. However, developers need to be mindful of maintaining accessibility standards while customizing components to avoid unintentionally introducing accessibility barriers.

Internationalization (i18n):

  • Internationalization Support: Angular Material has built-in support for internationalization (i18n) through Angular’s i18n features. It provides mechanisms for translating components, handling pluralization, and managing locale-specific formatting and date/time formatting. Angular’s i18n features allow developers to create multilingual applications easily.
  • Bootstrap and i18n: Bootstrap, being a CSS-based framework, does not have built-in i18n support. However, it can be used in conjunction with JavaScript-based i18n libraries or frameworks like Angular, React, or Vue.js to handle internationalization aspects.
  • Localization of Components: Angular Material offers localization support by providing translations for its components in different languages. This helps developers create applications that cater to users from different linguistic backgrounds without having to manually translate the components.
  • Right-to-Left (RTL) Support: Both Bootstrap and Angular Material offer RTL support, allowing developers to create applications for languages that are read from right to left. RTL support ensures proper layout and alignment of components, providing a seamless user experience for RTL language speakers.

It’s important to note that while both frameworks provide some level of accessibility and internationalization support, developers are responsible for implementing these features correctly. Adhering to best practices, including proper usage of ARIA attributes, semantic markup, focus management, and localization techniques, is crucial to ensure the highest level of accessibility and internationalization in web applications built with either Bootstrap or Angular Material.

Additionally, when aiming for accessibility and internationalization, it’s recommended to conduct thorough testing and consider involving users with disabilities and people from different cultural backgrounds to obtain feedback and ensure an inclusive user experience.

Angular Material vs Bootstrap: Which is better? 

As you know by now, Angular Material and Bootstrap are popular front-end frameworks for web application development. Angular Material is designed for use with Angular and follows Google’s Material Design principles. It offers pre-built UI components, theming, accessibility, and internationalization, making it suitable for enterprise applications. Bootstrap, on the other hand, is framework-agnostic and provides a wide range of CSS and JavaScript components. It has a larger community, more flexibility for customization, and is suitable for various project sizes.

The choice between this Angular Material vs Bootstrap battle depends on the specific needs of the project. If you are developing an Angular application and prioritize adherence to Material Design principles, Angular Material would be the preferred choice. It provides a consistent and polished UI, along with extensive Angular integration. On the other hand, if you require a framework that is framework-agnostic and provides a larger community and more flexibility in terms of customization, Bootstrap would be a better fit.

Ultimately, the decision should be based on the project requirements, design preferences, and familiarity with the frameworks. Both Angular Material and Bootstrap have their strengths and can be excellent choices for different types of projects.

Are you an experienced Bootstrap or Angular Material developer looking for a job?

Try Turing!

Turing helps software developers land their dream remote jobs in top US companies with long-term career growth and unmatched compensation. Visit the Jobs page to know more!

Angular Material vs Bootstrap: FAQs

  1. Which applications use Bootstrap?
    Some of the popular applications that use Bootstrap are PayPal, WhatsApp, Lyft, Etsy, Apple maps connect, Upwork, and Duolingo among others.
  2. Which popular applications use Angular Material?
    Popular applications that use Angular Material are Gmail, Asana, Momondo, and Airbnb among others.
  3. Is Angular Material easy?
    Developers familiar with the Angular framework can easily utilize the components of Angular Material.
  4. Is Bootstrap like WordPress?
    Bootstrap is a front-end framework that helps with the user interface and website design. WordPress provides both front-end and back-end tools to create a website.
  5. What are some Bootstrap alternatives?
    Some of the Bootstrap alternatives are Tailwind CSS, Material-UI, Semantic UI, Foundation, Bulma, UIKit, etc.
  6. What are some Angular Material alternatives?
    Some Angular Material alternatives are PrimeNG, Clarity, NG-ZORRO, Onsen UI, etc. 

Join a network of the world's best developers and get long-term remote software jobs with better compensation and career growth.

Apply for Jobs

By , June 7, 2023
Cloud Migration Process
For Employers

Navigating Cloud Migration: A Step-by-Step Guide to Successful Cloud Adoption

As businesses grow and evolve, they require a robust and flexible IT infrastructure that can adapt to changing needs and scale with the business. This is where the cloud emerges as a game-changer. The cloud is a cutting-edge technology that enables businesses to access computing resources over the internet, such as processing power, storage, and… View Article

As businesses grow and evolve, they require a robust and flexible IT infrastructure that can adapt to changing needs and scale with the business. This is where the cloud emerges as a game-changer. The cloud is a cutting-edge technology that enables businesses to access computing resources over the internet, such as processing power, storage, and applications, on-demand and from anywhere in the world. The cloud offers immense value to businesses of all sizes, from startups to large enterprises.

One of the significant benefits of cloud is flexibility. It offers businesses the scalability they need, providing resources when required, and allowing businesses to scale back when not needed. Another crucial advantage is cost savings. It eliminates the need for large upfront capital investments in infrastructure and equipment and instead allows businesses to pay for tailor-made services on a usage-based model.

Migrating applications and workloads to the cloud, however, requires careful planning and execution. Businesses can choose from various cloud migration approaches, such as rehosting, re-platforming, refactoring, or rebuilding, depending on their unique needs and goals. Rehosting involves moving existing applications to the cloud with little to no modification while re-platforming requires upgrading the applications to run on a new cloud platform. Refactoring involves developing cloud-native applications designed to take full advantage of cloud services while rebuilding involves creating entirely new cloud-based applications.

Even though the actual cloud migration process can be extremely daunting, with numerous factors to consider, such as selecting the appropriate tools, developing a future-proof strategy, and determining the appropriate types for optimum efficacy—it can bring profitable benefits with proper planning and execution. In this article, we will look into a tried and tested step-by-step guide to successful cloud adoption, including the benefits and pitfalls of the entire process.

Cloud Migration Process: Step-By-Step

Cloud Migration Process Step-By-Step

Cloud Migration Process Step-By-Step

Cloud adoption is becoming increasingly important for businesses seeking scalability, flexibility, and cost efficiency. By following these steps, organizations can navigate the complexities of cloud migration and maximize the benefits of the cloud for their operations.

Step 1: Identify Your Business Objectives and Requirements

The first step is a definite no-brainer — it fundamentally involves evaluating your current infrastructure and determining what aspects of your IT environment are suitable for cloud migration. You must also identify any compliance requirements, such as data privacy regulations and industry-specific standards, that must be considered during the cloud migration process. By identifying your business objectives and requirements, you can then select the appropriate cloud migration tools and develop a strategy that aligns with your business goals.

Step 2: Choose the Appropriate Cloud Migration Strategy

The next step in the cloud migration process is to choose the appropriate cloud migration strategy. There are several types of cloud migration, including lift and shift, re-platforming, and refactoring. Lift and shift involve moving applications and data to the cloud without making significant changes. Re-platforming involves making some modifications to applications and data to make them compatible with the cloud environment. Refactoring involves completely redesigning applications and data to take advantage of cloud-specific features and capabilities. Each of these strategies has its benefits and pitfalls, so it is essential to select the appropriate one for your organization’s specific needs.

Step 3: Develop a Cloud Migration Plan

Once you have gotten over steps 1 and 2, next up is to develop a cloud migration plan. This involves developing a timeline for the cloud migration process, identifying any potential risks or challenges, and developing a comprehensive plan for mitigating them. The plan should also include data migration to the cloud and application migration to the cloud, as well as testing and validation of the cloud environment to ensure that it is suitable for production.

Step 4: Select the Appropriate Cloud Migration Tools

Another crucial step in the process is selecting the appropriate cloud migration tools. These tools can help organizations identify the appropriate cloud migration strategy, migrate data and applications to the cloud, and manage the cloud environment once the migration is complete. Some popular and widely used tools include Amazon Web Services (AWS) Migration Hub, Microsoft Azure Migrate, and Google Cloud Migrate for Compute Engine. However, it is essential to evaluate each tool’s capabilities and limitations to select the one most appropriate and easily manageable for you and your team.

Step 5: Execute the Cloud Migration Process

Finally, the major step in the cloud migration process that requires your team’s intense focus is to execute the actual migration plan. This involves the substantial process of migrating data and applications to the cloud, testing and validating the cloud environment, and ensuring that the environment is suitable for production. During the cloud migration process, it is essential to monitor the cloud environment and identify any issues that arise. By addressing issues promptly, organizations can ensure that the entire process is successful and that all the elements are optimized for their specific needs and functions.

Benefits of Cloud Migration

One of the primary benefits of implementing the cloud migration process is increased scalability, allowing organizations to easily adjust their infrastructure to meet changing demands. For example, a retail company can easily scale up its cloud infrastructure during the holiday season to handle increased website traffic and then scale it down afterward to save costs.

Cloud migration can also improve data security and disaster recovery, as cloud providers typically offer robust data protection and backup solutions. With the extensive resources and expertise to implement and maintain robust security measures, cloud providers can ensure that sensitive data migration to the cloud and applications are protected from potential threats. For example, a healthcare provider can leverage cloud security features to protect patient information and comply with regulatory requirements at the same time — being able to focus on daily operations and worrying less about whether or not the data is safely tucked away from unauthorized third-party applications.

The cloud migration process also offers significant cost savings by reducing capital expenditures on hardware and software. By leveraging cloud infrastructure and services, organizations can shift to an operational expenditure model, paying only for the resources they use. For example, a startup company can save costs by leveraging cloud infrastructure rather than investing in expensive on-premise infrastructure.

Moreover, most often than not, the cloud migration process results in improved accessibility and collaboration. Cloud-based tools and applications can be accessed from anywhere, allowing employees to work remotely and collaborate seamlessly. For example, a global organization can leverage cloud-based tools to allow employees from different locations to collaborate on projects in real time — now that’s teamwork!

Pitfalls of Cloud Migration

While there are many benefits to the cloud migration process, there are also some potential pitfalls that organizations must be aware of. One of the main concerns would be the potential for vendor lock-in. This occurs when organizations become reliant on a particular cloud provider and find it challenging to switch to another provider due to the cost and effort involved. Another potential pitfall is the lack of control over the cloud environment, as organizations must rely on the cloud provider to manage the infrastructure and ensure uptime and reliability.

Another disadvantage is that the actual process can also be complex and time-consuming, with potential disruptions to business operations. If not executed correctly, application migration to the cloud can result in data loss, security breaches, and reduced productivity. Therefore, it is essential to plan the cloud migration process carefully, select the appropriate cloud migration tools, and engage experienced cloud migration specialists to make sure that all the crucial steps of the process are completely successful.

In conclusion, cloud migration is an essential process for organizations seeking to improve efficiency, scalability, and cost savings. Organizations can successfully navigate the cloud migration process and optimize their cloud environment by following a step-by-step guide and taking into account the benefits and pitfalls to ensure the highest ROI and project success.

Talk to Turing Experts

Talk to Turing Experts

Tell us the skills you need and we'll find the best developer for you in days, not weeks.

Hire Developers

By June 5, 2023
React custom hooks
For Developers

Custom React JS Hooks: What Are They and When to Use Them?

Why should you use custom React JS hooks in your code? 1. Cleaner code 2. Can be reused 3. Easy to maintain 4. Tons of custom hooks are already available online.

What is a custom hook? What are custom hooks in React? How do I make a custom hook in React JS? When would you use React custom hooks? Want to know everything about custom React JS hooks? Keep on reading.

Table of content:

  1. What are React custom hooks? How to make a custom hook in React JS? 
  2. What are the benefits of custom React hooks?
  3. How to create your first React custom hook?
  4. React custom hooks best practices
  5. Testing and Debugging Custom React.js Hooks
  6. Real-World Examples of Custom React.js Hooks
  7. Build React custom hooks examples
  8. Summary
  9. FAQs

What are React custom hooks? How to make a custom hook in React JS? 

React custom hooks are reusable functions that a React JS developer can use to add special and unique functionality to the React applications. Usually, if there is a requirement to add a feature, one can install a third-party library and solve the problem. But what if there is no such library with hooks that can be used? This problem is solved by using custom React JS hooks.

A custom hook is a special JavaScript function whose name starts with ‘use’ and can be used to call other hooks. Let’s take a look at some major differences between a custom React JS hook and React JS components:

  • A custom hook does not require a specific signature.
  • A software developer can choose what argument the custom hook has and what should the argument return.
  • A custom hook always starts with the name ‘use’.

Here’s an example of how using a Custom React JS hook can help you write clean code and reduce the rendering time:

What are the benefits of custom React hooks?

Custom React JS hooks offer three major benefits over standard library hooks: Reusability, readability, and testability.

  1. Reusability
    Custom React JS hooks offer reusability as when a custom hook is created, it can be reused easily, which ensures clean code and reduces the time to write the code. It also enhances the rendering speed of the code as a custom hook does not need to be rendered again and again while rendering the whole code.
  2. Readability
    Instead of using High-Order Components (HOCs), one can use custom hooks to improve the readability of the code. Complex codes can become hard to read if layers of providers surround the components, consumers, HOCs, render props, and other abstractions, generally known as wrapper hell.
    On the other hand, using custom React JS hooks can provide cleaner logic and a better way to understand the relationship between data and the component.
  3. Testability
    Generally, the test containers and the presentational components are tested separately in React. This is not a trouble when it comes to unit tests. But, if a container contains several HOCs, it becomes difficult as you will have to test the containers and the components together to do the integration tests.
    Using custom React JS hooks, this problem can be eliminated as the hooks allow you to combine containers and components into one component. It also makes it easier to write separate unit tests for custom hooks. Using custom hooks also makes it easier to mock hooks when compared to mock HOCs as it is similar to mocking a function.

How to create your first React custom hook?

How to create your first React custom hook

How to create your first React custom hook

Custom React.js Hooks allow you to encapsulate reusable logic and state it in a concise and modular way. It’s simple to make your own unique Hook by following a few fundamental guidelines. Let’s go over how to create your first unique React.js Hook step by step.

  • Identify the Logic to Extract: Start by identifying the logic that you want to extract into a custom Hook. It could be a piece of state management, a common API call, or any other reusable functionality. Extracting this logic into a custom Hook will help you reuse it across different components.
  • Create a New File: Create a new JavaScript file for your custom Hook. It’s a good practice to name the file using the convention use<HookName>.js to indicate that it’s a custom Hook.
  • Define the Hook Function: In the newly created file, define a function that represents your custom Hook. The function name should begin with “use” to follow the Hook naming convention. Inside this function, you can define the state variables, helper functions, or any other logic necessary for your custom Hook.
  • Define the Hook Signature: Decide what inputs your custom Hook requires and what outputs it should provide. Typically, you’ll define the dependencies required by your Hook as function arguments and return the necessary values as an array or an object. This allows components using your custom Hook to easily access the required data.
  • Implement the Hook Logic: Implement the core logic of your custom Hook inside the function body. This can include setting up event listeners, making API calls, or managing the state. You can also include any necessary cleanup logic using the useEffect Hook.
  • Export the Custom Hook: Finally, export your custom Hook function from the file so that it can be imported and used in other parts of your React.js application.

Once your custom Hook is created, you can import and use it in your components just like any other built-in Hook. This encapsulates the reusable logic within your custom Hook and promotes code reusability and maintainability.

React custom hooks best practices

React custom hooks best practices

React custom hooks best practices

When creating custom React.js Hooks, following best practices ensures that your Hooks are well-designed, maintainable, and reusable. Here are some essential React custom hooks best practices to keep in mind:

  • Naming Convention: It’s a good practice to prefix your custom Hooks with “use” to adhere to the naming convention established by React.js. This helps other developers understand that the function is a Hook and should be used accordingly.
  • Single Responsibility Principle: Aim to keep your custom Hooks focused on a single responsibility. This improves code readability, reusability, and maintainability. If a Hook becomes too complex or handles multiple concerns, consider refactoring it into smaller, more specialized Hooks.
  • Dependency Injection: Design your custom Hooks to be flexible and accept necessary dependencies as arguments. This allows components using the Hook to provide their specific dependencies, promoting reusability. Avoid hardcoding dependencies within your custom Hooks.
  • Documentation and Examples: Provide clear and comprehensive documentation for your custom Hooks. Explain their purpose, required inputs, return values, and any additional configuration options. Include examples and usage patterns to help developers understand how to use the Hook effectively.
  • Avoid Prop Drilling: Custom Hooks can help you avoid prop drilling, which occurs when you need to pass props through multiple intermediate components. By encapsulating common functionality within a custom Hook, you can provide the necessary values directly to the components that need them, simplifying your component hierarchy.
  • Testability: Ensure your custom Hooks are easily testable. Write unit tests that cover different use cases and edge cases for your Hooks. Use testing frameworks and libraries such as Jest and React Testing Library to create robust test suites for your custom Hooks.
  • Consistent Abstractions: Consider the abstractions and patterns used in your custom Hooks. Strive for consistency across your codebase to make it easier for developers to understand and use your Hooks. Stick to common patterns and naming conventions to enhance code readability.
  • Versioning and Documentation Updates: If you provide your unique Hooks as open-source libraries, abide by semantic versioning best practices and record any significant changes. Keep your documentation current and include detailed directions on how to upgrade to new Hook versions.

You can make sure that your unique Hooks are well-designed, reusable, and simple to comprehend by following these recommended practices. This encourages code maintainability and improves developer collaboration while working with the same source.

Remember to continuously improve and refine your custom Hooks based on feedback and real-world usage. Regularly review and update them to align with the evolving best practices and standards in the React.js community.

With these best practices in mind, you can create high-quality custom Hooks that enhance your React.js development experience and contribute to the overall success of your projects.

Testing and Debugging Custom React.js Hooks

When it comes to developing robust and reliable software, testing and debugging are crucial steps in the development process. The same holds true for custom React.js Hooks. In this section, we will explore the importance of testing custom Hooks and discuss various techniques and tools available for testing and debugging them.

Also, read: Eleven Great Websites to Test your Code Online 

Importance of Testing Custom Hooks:

Testing custom Hooks is essential to ensure their correctness and maintainability. By writing tests for your custom Hooks, you can verify that they work as expected, handle edge cases correctly, and don’t introduce any regressions. Furthermore, testing allows you to refactor your Hooks with confidence, knowing that existing functionality remains intact.

Testing Techniques for Custom Hooks:

Testing Techniques for Custom Hooks

Testing Techniques for Custom Hooks

Unit Testing: The most fundamental testing approach is unit testing, which involves testing each custom Hook in isolation. You can use testing frameworks like Jest along with utilities like React Testing Library or Enzyme to render components that utilize your Hooks and assert their behavior. Mocking dependencies or using test doubles can also be useful in isolating the Hook’s logic during testing.

Integration Testing: In addition to unit tests, it’s important to perform integration testing to verify that your custom Hooks work correctly within the context of your application. Integration tests involve testing multiple components together and ensuring that the Hooks interact seamlessly with other parts of your codebase.

Also, read: Unit Testing vs Integration Testing: 4 Key Differences Explained 

Mocking and Stubbing: When testing custom Hooks, you may encounter situations where you need to simulate certain behaviors or dependencies. Mocking libraries like Jest’s jest.mock() or Sinon.js can help you create mock versions of external APIs or modules, allowing you to control their behavior during testing. Stubbing can be useful for replacing certain functions or methods within the Hook to isolate specific behaviors.

Debugging Custom Hooks:

While testing helps identify issues in custom Hooks, debugging is an essential step in fixing those issues. Here are a few techniques for debugging custom Hooks effectively:

  • Logging: Adding console.log statements within your custom Hook can provide valuable insights into its internal state and the flow of data. You can log important variables, function calls, or conditional branches to track down the source of any unexpected behavior.
  • Chrome DevTools: The React DevTools extension for Chrome provides powerful debugging capabilities. You can inspect component hierarchies, monitor state changes, and examine the props passed to your custom Hooks. This allows you to understand how your Hook is being utilized and identify potential issues.
  • React Error Boundaries: If your custom Hook throws an error, you can use React’s Error Boundary feature to catch and handle those errors gracefully. This prevents the error from propagating and crashing your entire application, providing a better user experience.
  • Debugging Tools: Libraries like React Developer Tools or Redux DevTools can be invaluable for inspecting and debugging your custom Hooks. These tools offer advanced features such as time-travel debugging, state inspection, and performance profiling, enabling you to diagnose complex issues efficiently.

Remember to invest time in writing comprehensive tests and incorporating effective debugging techniques into your development workflow. This will save you time and effort in the long run, ensuring that your custom Hooks are reliable, maintainable, and free from bugs.

By thoroughly testing and diligently debugging your custom Hooks, you can have confidence in their functionality and robustness, leading to more stable and predictable React.js applications.

Real-World Examples of Custom React.js Hooks

Custom React.js Hooks have gained popularity in the React.js community due to their ability to encapsulate reusable logic and promote code reusability. In this section, we’ll explore real-world examples of custom Hooks, showcasing how they are utilized effectively in various applications and libraries.

  • Authentication Hooks: Authentication is a common requirement in web applications. Custom Hooks can simplify the implementation of authentication by encapsulating the authentication logic, token management, and user session handling. These Hooks provide a clean and reusable interface for handling authentication-related functionality across components.
  • Theme Switching Hooks: Many applications offer theme customization options to users. Custom Hooks can manage the theme state, apply theme changes, and persist the chosen theme in local storage. By encapsulating the theme-switching logic, Hooks make it easier to implement and reuse theme switching functionality across different parts of the application.
  • Data Fetching Hooks: Data fetching from APIs can be managed via custom hooks, which offer a neat and reusable solution to handle loading states, error handling, and data caching. Components may simply consume data without having to worry about implementation specifics thanks to these hooks, which abstract away the complexity of API calls.
  • Form Handling Hooks: Forms are a fundamental part of many web applications. Custom Hooks can handle form validation, state management, and form submission logic. By encapsulating the form-related functionality, Hooks enable developers to create reusable form components with consistent behavior across the application.
  • Animation Hooks: Animations and transitions can greatly enhance the user experience. Custom Hooks can encapsulate animation logic, providing an intuitive and reusable interface for creating complex animations. These Hooks can handle timing, easing functions, and triggering animations based on user interactions or component state changes.

Build React custom hooks examples

There are plenty of React custom hooks. Here are two popular React custom hooks examples with usage for you to understand them better.

Example 1: Build React custom hooks: useFetch

import { useState, useEffect } from 'react';

const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);
        const json = await response.json();
        setData(json);
        setLoading(false);
      } catch (error) {
        setError(error);
        setLoading(false);
      }
    };

    fetchData();
  }, [url]);

  return { data, loading, error };
};

export default useFetch;

How to use useFetch React custom hook?

The useFetch React custom hook is a great way to fetch data from an API in a reusable way. It takes a URL as an argument and returns an object with the response data, loading state, and error state. This makes it easy to keep track of the state of the fetch request and display the data in your component.

import useFetch from './useFetch';

const MyComponent = () => {
  const { data, loading, error } = useFetch('https://api.example.com/data');

  if (loading) {
    return <div>Loading...</div>;
  }

  if (error) {
    return <div>Error: {error.message}</div>;
  }

  return (
    <div>
      {/* Display fetched data */}
    </div>
  );
};

Example 2: Build React custom hooks: useLocalStorage

import { useState } from 'react';

const useLocalStorage = (key, initialValue) => {
  const [value, setValue] = useState(() => {
    const storedValue = localStorage.getItem(key);
    return storedValue ? JSON.parse(storedValue) : initialValue;
  });

  const updateValue = (newValue) => {
    setValue(newValue);
    localStorage.setItem(key, JSON.stringify(newValue));
  };

  return [value, updateValue];
};

export default useLocalStorage;

How to use useLocalStorage React custom hook?

The useLocalStorage React custom hook is a great way to store data in local storage in a reusable way. It takes a key as an argument and returns an object with the current value of the key and a function to set the value of the key. This makes it easy to store and retrieve data from local storage in your components.

import useLocalStorage from './useLocalStorage';

const MyComponent = () => {
  const [count, setCount] = useLocalStorage('count', 0);

  const increment = () => {
    setCount(count + 1);
  };

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={increment}>Increment</button>
    </div>
  );
};

Summary

Custom React JS hooks can help developers save time, are reliable, reusable, and make the code clean. Creating custom React JS hooks is relatively easy, and you can search for many open sources where you can get some custom hooks from the library already created by developers. The benefits of custom React hooks include reusability, readability, and testability. 

Are you a React JS developer well versed in React coding looking for a job in the US? Try Turing. With Turing, you get a work-from-anywhere US-based software development job, which means you don’t have to travel all the way to the US. Head to Turing’s Apply for Jobs page to know more.


FAQs

  1. How do you make a custom hook in React?

    A custom React JS hook is created by using the ‘use’ prefix. For example, a custom hook can be named ‘useLocalStorage’ or ‘useBoolean’. A custom hook will consist of one or more React JS hooks from the library. For more information on how to create a Custom hook, take a look at this video:

  2. When would you use React custom Hooks?

    If you have one or multiple React hooks that will be used at multiple locations in a code, you should use custom React JS hooks. This helps in making the code more readable and make the code clean.

  3. What is the difference between React Redux and Custom Hooks?

    React Redux is a state management library that offers a centralized store, actions, and reducers for managing global application state. It is commonly used in larger applications to handle complex state interactions. React Redux provides a way to connect React components to the Redux store, allowing components to access and update the shared state. It follows a more structured and explicit approach to state management.

    On the other hand, custom Hooks in React are a way to encapsulate reusable logic and state within functional components. Custom Hooks are typically used for local component state management and can handle specific functionality, such as form validation or API calls. They promote code reuse and simplify the logic within components. Custom Hooks offer a more lightweight and flexible approach to state management within individual components, without the need for a centralized store or complex reducers.

  4. What is HOC vs React custom Hooks?

    Higher-Order Components (HOCs) and React custom Hooks are two different patterns used in React for code reuse and logic sharing.

    HOCs are functions that take a component as input and return a new enhanced component with additional props or functionality. They enable cross-cutting concerns, such as authentication or data fetching, to be applied to multiple components. HOCs can introduce complexity with prop drilling and nesting.

    On the other hand, React custom Hooks are functions that encapsulate reusable logic within functional components. They allow stateful logic to be shared without the need for inheritance or prop drilling. Custom Hooks promote cleaner and more composable code, making it easier to share logic across different components. They provide a simpler and more direct approach to code reuse compared to HOCs.

  5. Why create custom Hooks in React?

    Creating custom Hooks in React allows developers to encapsulate and reuse logic within functional components. It promotes code reusability, readability, and maintainability by abstracting away complex logic into reusable units. Custom Hooks enable the sharing of stateful logic without the need for class components, inheritance, or prop drilling, resulting in cleaner and more modular code.

  6. What are the rules of React hooks?

    The three rules of React hooks are as follows: 
    • Hooks should only be called at the top level of a React functional component or within custom hooks, ensuring consistent and predictable execution. 
    • Hooks must be called exclusively from within React functions, such as functional components or custom hooks, maintaining the appropriate React context. 
    • When using the useEffect hook, it is crucial to provide a dependency list that specifies the variables the effect depends on. This enables React to re-run the effect when any of these dependencies change, avoiding unintended behavior. Adhering to these rules promotes clean and efficient code while leveraging the power of React hooks.

      Following these rules of React hooks will ensure that they are used correctly and consistently in your functional components.

Join a network of the world's best developers and get long-term remote software jobs with better compensation and career growth.

Apply for Jobs

By May 26, 2023
Maximizing Business Value through Application Portfolio Rationalization
For Employers

Maximizing Business Value through Application Portfolio Rationalization

Benefits of application portfolio rationalization: 1. leads to cost savings 2. improves application performance 3. offers better visibility into application usage

In today’s fast-paced, technology-driven world, companies rely heavily on various applications to perform their daily operations. However, maintaining a large number of applications can be challenging and expensive, forcing companies to focus on maximizing their value proposition while minimizing costs. One way to achieve this is through application portfolio rationalization (APR), a process that focuses on assessing the existing portfolio of applications and strategizing how to best leverage the footprint of applications.

What is Application Portfolio Rationalization?

What is Application Portfolio Rationalization

What is Application Portfolio Rationalization

Application portfolio rationalization is the process of assessing an organization’s existing application portfolio and identifying redundant or outdated applications. This process helps identify applications that can be consolidated, retired, or replaced with more efficient solutions. The main goal of application portfolio rationalization is to optimize the application portfolio, leading to reduced costs and improved operational efficiency.

Benefits of Application Portfolio Rationalization

Benefits of Application Portfolio Rationalization

Benefits of Application Portfolio Rationalization

Application portfolio rationalization is more than just a buzzword—it’s a powerful strategy that can help organizations streamline their IT and significantly boost productivity. By combining cost optimization and performance enhancement, this strategy unlocks a world of opportunities for businesses to thrive.

Cost Optimization: Unleashing Financial Freedom

The magic of application portfolio rationalization truly begins when organizations grasp its potential for cost optimization. As the digital landscape expands and becomes more sophisticated, maintaining sprawling applications often becomes a financial drain. Instead of letting these redundant or antiquated applications sap your resources, application portfolio rationalization empowers your team to strategically purge unwarranted expenses.

By taking the axe to unnecessary applications, organizations can realize significant savings on maintenance and support costs. This fiscal freedom then allows more effective resource allocation, ultimately cutting down bloated IT expenditures and opening up new possibilities for growth and innovation.

Revolutionary Performance Improvements: Elevating Your IT Ecosystem

Another game-changing benefit of application portfolio rationalization is its ability to supercharge application performance. As technology evolves, managing an exceedingly complex web of applications becomes a daunting mission, often resulting in performance hiccups like sluggish response times or system crashes.

However, with an expertly rationalized application portfolio, your organization will be equipped to uncover and tackle underperforming applications at their roots. By zeroing in on the performance bottlenecks and implementing the right solutions, application portfolio rationalization translates into a faster, more efficient IT ecosystem that propels productivity to new heights.

In short, application portfolio rationalization redefines the way organizations optimize their IT—simultaneously streamlining costs and upping performance. Don’t let your organization be shackled by excessive applications; unlock the full potential of your IT with this transformative strategy.

Potential Pitfalls of Application Portfolio Rationalization

Potential Pitfalls of Application Portfolio Rationalization

Potential Pitfalls of Application Portfolio Rationalization

Application portfolio rationalization comes with a plethora of advantages, but it’s not without its share of challenges. Smart organizations will be ready to face these potential pitfalls head-on, ensuring that they reap only the rewards of a streamlined IT landscape.

Safeguarding Interconnected Business Processes

While reaping the benefits of application portfolio rationalization, organizations must tread cautiously to avoid disrupting critical business processes. Behind the curtain, applications often rely on each other to seamlessly perform an array of essential functions. Eliminating an application without thorough planning or testing can wreak havoc on vital processes and lead to costly downtime and missed revenue opportunities.

To circumnavigate this pitfall, organizations must establish a well-defined process for evaluating and rationalizing applications, effectively minimizing the risk of disruption and safeguarding interdependent operations.

Assessing Application Value: When Every Decision Counts

Another hurdle in application portfolio rationalization is the challenge of valuing each application’s contribution to the business. While some applications may be fundamental to a particular function, their true worth might not be immediately obvious. This creates a conundrum as organizations try to decide whether to retain, replace, or remove these applications.

The solution? A comprehensive analysis of each application’s value to the organization. With actionable data in hand, organizations can confidently make well-informed decisions that positively impact their IT infrastructure and bottom line.

That said, although application portfolio rationalization comes with its fair share of obstacles, a forward-thinking organization with the right strategies in place doesn’t need to break a sweat. Arm your team with proper planning and assessment tools to overcome these challenges and harness the full potential of rationalized IT.

How Application Portfolio Rationalization Maximizes Business Value

Despite these potential pitfalls, application portfolio rationalization can help organizations maximize business value. One way this is achieved is by improving alignment between IT and business objectives. Often, IT departments are tasked with maintaining and supporting applications, while the business has its own set of objectives. Application portfolio rationalization provides a framework for aligning IT and business objectives to ensure that the application portfolio supports the organization’s overall goals.

Another way that application portfolio rationalization can help maximize business value is through better visibility into application usage and performance. By analyzing application usage and performance metrics, organizations can gain a better understanding of how their applications are being used and identify areas for improvement. This can lead to more informed decision-making when it comes to rationalizing the application portfolio.

Conclusion

In summary, application portfolio rationalization is a process that can help organizations maximize business value by optimizing their application portfolio. It can lead to cost savings, improved application performance, better alignment between IT and business objectives, and better visibility into application usage and performance. However, be aware of the potential pitfalls, such as the risk of disrupting critical business processes and the difficulty of identifying the value of each application. With careful planning and execution, application portfolio rationalization can help organizations achieve their business goals and stay competitive in today’s ever-changing business landscape.

Talk to Turing Experts

Talk to Turing Experts

Tell us the skills you need and we'll find the best developer for you in days, not weeks.

Hire Developers

By May 22, 2023
Sales Development Representative Day in Life
For Developers

Welcome to a day in the life of Vadin*, an SDR (Sales Development Representative) at Turing! 

Vadin is an SDR at Turing. In this post, he talks about his schedule and gives a perfect glimpse into a typical SDR day. Let’s see how Vadin describes his day.

Vadin’s job is to connect with new clients to help them discover the benefits of collaborating with Turing. 

Turing’s fully remote flexibility and comprehensive data analytics make the job as simple as can be. 

Vadin is based in India but works in the U.S. market, so his work hours overlap with his neighbors’ bedtime. But that doesn’t mean he misses out on life. In fact, he is currently enrolled in a master’s business program, watches football, and spends ample time with family and friends. 

Listening to Vadin talk about his schedule gives a perfect glimpse into a typical SDR day. Even with his working hours aligned with the United States, Vadin takes full advantage of his daytime hours! It’s hard to not be envious when going through his schedule. 

Let’s see how Vadin describes his day:

~~~~~~~~~~~~~~~~~~~~~

10:30 AM IST (10 PM PST) – Alarm buzzes. Ah, time to wake up and smell the chai. I can’t start my day without a cup of chai and some breakfast. My family is awake, and I spend the late morning chatting with them. 

11:30 AM IST (11 PM PST) – Start studying for my master’s program. Continuing education is very important to me, and I’m grateful my schedule allows for 2–3 hours of daytime to focus on my studies. 

2:30 PM IST (2 AM PST) – Time for lunch. I’m a firm believer in the power of lunchtime. I take a break to eat some delicious food and catch up with whoever’s around. Sometimes I’ll go out to lunch with friends to share stories about our weekends and have a good laugh to energize my midday—perfect timing to beat the restaurant lunch rush! I also like to go for a walk outside to clear my mind and prepare for the second half of my day.

4:00 PM IST (3:30 AM PST) – Reconnect with family, watch football, run errands, or whatever else needs to be done that day. 

8:00 PM IST (7:30 AM PST) – Around this time I start preparing for my work. I sign on to check in with my manager, read any emails, prioritize action items, and do some client prospecting. I’m currently on an account-based campaign, so research is a big part of my role. Others are on different campaigns where client leads are given by the operations team. That role involves a lot more cold-calling, so our schedules can vary a bit. 

8:30 PM IST (8:00 AM PST) – Once I’m caught up, I join the daily sync-up meeting where we discuss the strategy on how to reach a prospect, share any blockers with managers, and brainstorm solutions. Our stand-up meeting is one of the best parts of working at Turing, as I can even listen to my call recordings with managers to learn from my mistakes and improve for the next call. My direct manager Arun is very good about giving polite feedback in the meeting, while more personal or stringent feedback is reserved for one-on-ones. 

9:30 PM IST (9 AM PST) – Dinner time! Here I break for 15–20 minutes to have dinner with my family and re-fuel for the work ahead. I wish them all sweet dreams, and then it’s back to work!

10 PM IST (9:30 AM PST) – After dinner, it’s time to put on my detective hat and start researching potential clients. I comb through LinkedIn and other platforms to find more companies that might be interested in our services and ensure the ones I was assigned had decision-making power. Then I dive into making connections. I spend about 2 hours researching prospects and reaching out in creative ways to make first impressions. 

12 AM IST (11:30 AM PST) – Break time. As an SDR, collaboration is crucial, and I like to keep a good relationship with my team members. I discuss progress with the team and learn about their experience with their prospects—we even practice our pitches on each other. I also like to stretch at this time and maybe grab a snack. It’s important to stay active and vibrant through the night! 

12:30 AM IST (12 PM PST) – It’s noon on the U.S. Pacific Coast—the best time for cold-calling. I’ve found that people are much friendlier and more likely to answer after morning meetings and lunchtime. I spend about 3 hours calling and try to make 40–60 calls a day. For other campaigns, calling time might be higher and targets increased to 100–120 calls a day. 

I use various sales and marketing techniques to grab the attention of prospects and start the conversation. My main goal is to identify a prospect’s needs and pain points and see if Turing’s services can solve their problems.

I also like to throw in some jokes and puns in my messages to make them stand out.

3:30 AM IST (3 PM PST) – As the day nears the end, I spend time updating the CRM and other sales tools. I review my progress for the day, prepare reports, and identify goals for the next day.

4 AM IST (3:30 PM PST) – Once the day is over, it’s time to sign off and unwind. I get myself ready for bed and spend some quiet time reading or meditating to slow down my brain from an active day at work. As long as I’m asleep before the sun comes up around 6 AM, I’m good for a full 6–8 hours of regenerative rest. 

~~~~~~~~~~~~~~~~~~~

All in all, a day in the life of an SDR at Turing is never dull. It takes persistence, patience, and efficiency to identify and qualify potential leads for the company, but Vadin loves the challenge of converting new clients and making connections, even if he doesn’t work a typical 9-5. And the fact that he can ask for different campaigns and rearrange his schedule the way it works best for him allows him to discover the most productive practices.

Vadin says he has complete autonomy in his work, be it making changes in the templates or requesting a new CRM tool with better features. He feels his voice is always heard and appropriate measures are taken to remove any blockers. He enjoys his work and feels like a valuable part of the sales process. With dedication, hard work, and the right attitude, Vadin and other SDRs are making significant contributions to Turing’s success.

So here’s to you, Vadin—keep on slaying those sales!

*Names have been changed to maintain privacy.

Join a network of the world's best developers and get long-term remote software jobs with better compensation and career growth.

Apply for Jobs

By May 16, 2023
Most Popular
All Blog Posts