Skip to main content

Creating a plugin

In Clubs, Astro library is used, so even if you create a plugin, you need to create it using the Astro library.

Preparation

To start creating a plugin, use the Clubs Plugin Starter Kit.

Access the following GitHub repository and clone it.

https://github.com/dev-protocol/clubs-plugin-starter-kit

After cloning, run the following command to install dependencies.

yarn install

To launch a preview of the plugin, run the following command. Use this command to check the operation of the plugin during development.

yarn preview

src directory

Write your plugin code in folders under src directory.

index.ts

index.ts is the main file of the plugin. Write metadata and page settings for plugins here.

Edit meta

First, update the metadata for your plugin. Update ClubsPluginMeta with information about your plugin. The metadata includes:

KeyDescription
idPlugin ID. Set it with a value starting with clubs-plugin.
displayNamePlugin name displayed in marketplace
categoryCategory to which the plugin belongs
iconPlugin icon displayed in marketplace. Import image files and specify them
descriptionPlugin description
preview ImagesPreview images of plugins. Import image files and specify them
readmePlugin Readme
tip

Read Meta to know more details.

Create getPagePaths

getPagePaths can control which pages are displayed for your created plugin. Set paths, component, and props.

If you want to display AnyAstroComponent on /buy, you can use the following code:

export const getPagePaths = async (options: ClubsPluginOption[], config: ClubsConfigration) => [
{
paths: ['buy']
component: AnyAstroComponent,
props: {something: {optional: {data: 1}}
}
]
tip

Read Pages to know more details.

getAdminPaths

getAdminPaths can control the pages of your plugin's admin page. You can set paths, component, and props.

If you want to display AnyAstroComponent on /admin/buy, you can use the following code:

export const getAdminPaths = async (options: ClubsPluginOption[], config: ClubsConfigration) => [
{
paths: ['buy'],
component: AnyAstroComponent,
props: {something: {optional: {data: 1}}
}
]
tip

Read Admin pages to know more details.

getSlots

If you want to display content in a specific area on the Clubs page, declare getSlots. In the code below, AnyAstroComponent is displayed at each of the following areas on the admin page: sidebar:before-title, aside:after-built-in-buttons, content:home:before-content.

export const getSlots = async (
options: ClubsPluginOption[],
config: ClubsConfiguration,
utils
) => [
{
slot: 'admin:sidebar:before-title',
component: AnyAstroComponent,
props: { options }, // OPTIONAL
},
{
slot: 'admin:aside:after-built-in-buttons',
component: AnyAstroComponent,
props: { options }, // OPTIONAL
},
{
slot: 'page:content:home:before-content',
component: AnyAstroComponent,
props: { options }, // OPTIONAL
},
]
tip

Read Slots to know more details.

Component

Use Astro components to load components into index.ts. From within Astro components, you can call React/Vue/Svelte components.

---
import Admin from './Admin.vue'
---

<Admin client:load />

Saving values

To save values in a plugin, use setOption() exported from @devprotocol/clubs-core.

setOptions(data: ClubsPluginOptions, pluginIndex: number)

With setOption, you can save the data object of the first argument. The second argument pluginIndex is an index assigned to each plugin and can be received with Astro.props in any Astro component developed for admin pages.

---
import Admin from './Admin.vue'
import type {ClubsPropsAdminPages} from '@devprotocol/clubs-core'

const {clubs} = Astro.props as ClubsPropsAdminPages
---

<Admin client:load pluginIndex={clubs.currentPluginIndex} />

Also note that setOption can only be used in Admin pages and cannot be used in front pages. In addition, values are not saved in preview environments on Clubs Plugin Starter Kit. If you want to handle values saved with setOption in preview environments, you can write them in /preview/config.ts.

plugins: [
{
id: 'clubs-plugin-foo',
options: [
{
key: 'foo',
value: [
{ id: 1, foo: 'foo' },
{ id: 2, foo: 'bar' },
{ id: 3, foo: 'baz' },
],
},
],
},
]

Specify the plugin ID for id and write the option values to be saved for options.

tip

Read Admin pages to know more details.

Using values

The saved value is stored in Astro.props, so get them from there.

src/index.ts
import {default as Admin} from './components/Admin/Admin.astro'

export const getAdminPaths = async (options: ClubsPluginOption[], config: ClubsConfigration) => {
const foo = options.find(opt=>opt.key==='foo')
return [
{
paths: ['buy']
component: Admin,
props: {foo}
}
]
}
src/components/Admin/Admin.astro
---
import Admin from './Admin.vue'
import type {ClubsPropsAdminPages} from '@devprotocol/clubs-core'

const {foo, clubs} = Astro.props as ClubsPropsAdminPages
---

<Admin client:load foo={foo} pluginIndex={clubs.currentPluginIndex} />

Styling

Clubs incorporates Tailwind so you can use almost all Tailwind APIs. However, since plugins cannot access tailwind.config.js, you need to write all CSS with tailwind classes or define them using <style>.

<template>
<section class="py-10">
<h1 class="mb-10 text-4xl text-gray-700 font-bold text-center">Foo</h1>
</section>
</template>

Publishing to npm

To publish a plugin to Clubs, you need to publish it to npm. Before publishing your plugin to npm, please check the following:

  • Change package.json so that it reflects the information of the plugin you created, as it is set at the time of cloning.
  • Run npm init and add the necessary items for publication to package.json.
  • Change the name. The name should include "clubs-plugin".
  • Change other items to match your plugin's information.

Once you have completed these steps, let’s publish it to npm.

tip

Read Publish your plugin to know more details.