DEV Community

Cover image for I Made a Chrome Extension. Slack Channels Grouping
yamadashy
yamadashy

Posted on β€’ Edited on

2 2

I Made a Chrome Extension. Slack Channels Grouping

Too many channels make eyes suffering 😫
I made a Chrome extension that grouping channels nicely!

Original
Grouped

Install here

Feature

It grouping channels by hyphens and underscores.

  • animal-dog
  • animal_cat

It observe DOM updates, so it support channel creation and renaming.
If the tab is inactive, DOM observing is turned off.

Why

In my team, there is rule of putting "prefix-" in channel name.
As the number of channels continues to increase, it has become hard to tell apart between "chat" and "club" πŸ€”

So I made it to make design as eye-friendly as possible.

About Development

I write about the following keywords.

  • webextension-toolbox
    • webpack
    • TypeScript
  • Page Visibility API
  • requestIdleCallback

webextension-toolbox

webextension-toolbox is extension creation tool for Chrome, Firefox etc.
webextension-toolbox/webextension-toolbox - GitHub

You can easily output Chrome and Firefox extensions without thinking about cross-browser support.

Generate a template with the following command,

yarn global add yo generator-web-extension
yo web-extension
Enter fullscreen mode Exit fullscreen mode

Start development,

yarn dev chrome
Enter fullscreen mode Exit fullscreen mode

Output zip,

yarn build chrome
Enter fullscreen mode Exit fullscreen mode

Just uploads to Chrome Web Store Dashboard.

It's easy as pie!

webpack

webextension-toolbox builds with webpack, but you can develop even if you have never touched webpack.
If you are familiar with webpack, you can easily extend it.

TypeScript

Recently I have been actively using TypeScript, and I used it.

If you are using typescript and webextension-toolbox, you need to create a file webextension-toolbox-config.js to overwrite the configuration.

module.exports = {
  webpack: (config, { dev, vendor }) => {
    config.resolve.extensions.push('.ts')
    config.module.rules.push({
      test: /\.ts$/,
      loader: 'ts-loader'
    })
    return config
  }
}
Enter fullscreen mode Exit fullscreen mode

The benefits of TypeScript are great if it is a large-scale extension.

Page Visibility API

This API observe whether the page is visible.
Page Visibility API - Web APIs | MDN

This extension observe DOM with MutationObserver. I don't want to keeping it working, so I use this API to control it.

document.addEventListener("visibilitychange", () => {
  if (document.hidden) {
    // Stop observing
  } else {
    // Restart observing
  }
}
Enter fullscreen mode Exit fullscreen mode

requestIdleCallback

This API performs processing when event loop is idle so that it does not block other processing.
This article nicely order about this API.
Using requestIdleCallback | Web | Google Developers

requestIdleCallback(() => {
  // execute
}, {
  timeout: 3000 // Forced execution if not executed after 3 seconds
})
Enter fullscreen mode Exit fullscreen mode

This API is used to grouping channel list.

Lastly

I knew webextension-toolbox for the first time, but it was very convenient and great.
You can create cross-browser extensions quickly, so try it! πŸ˜„

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

Top comments (0)

SurveyJS custom survey software

JavaScript Form Builder UI Component

Generate dynamic JSON-driven forms directly in your JavaScript app (Angular, React, Vue.js, jQuery) with a fully customizable drag-and-drop form builder. Easily integrate with any backend system and retain full ownership over your data, with no user or form submission limits.

Learn more

The only thing worse than downtime? No Answers.

If you’re sometimes frustrated with opaque infrastructure, sluggish support, and mysterious outages, we prepared a webinar just for you

Tune in to the full event

DEV is partnering to bring live events to the community. Join us or dismiss this billboard if you're not interested. ❀️