jam411 3 лет назад
Родитель
Сommit
27617a6f76

+ 22 - 0
packages/app/src/client/services/switch-plugin.ts

@@ -0,0 +1,22 @@
+// import { readFileSync } from 'fs';
+// import path from 'path';
+
+// import { CustomWindow } from '~/interfaces/global';
+// import { GrowiPlugin } from '~/interfaces/plugin';
+// import { initializeGrowiFacade } from '~/utils/growi-facade';
+// import { resolveFromRoot } from '~/utils/project-dir-utils';
+
+
+// export type GrowiPluginManifestEntries = [growiPlugin: GrowiPlugin, manifest: any][];
+
+
+// export class SwitchPluginService {
+
+//   static async switchPluginIsEnabled(growiPlugins: GrowiPlugin[]): Promise<boolean> {
+//     return growiPlugins[0].isEnabled;
+//     // .forEach(async(growiPlugin) => {
+
+//     // });
+//   }
+
+// }

+ 30 - 3
packages/app/src/components/Admin/PluginsExtension/PluginCard.tsx

@@ -3,21 +3,48 @@ import React, { useState } from 'react';
 
 
 import Link from 'next/link';
 import Link from 'next/link';
 
 
+import { apiv3Post } from '~/client/util/apiv3-client';
+import { useSWRxPlugin } from '~/stores/plugin';
+
 import styles from './PluginCard.module.scss';
 import styles from './PluginCard.module.scss';
 
 
+
 type Props = {
 type Props = {
+  id: string,
+  isEnabled: boolean,
   name: string,
   name: string,
   url: string,
   url: string,
   description: string,
   description: string,
 }
 }
 
 
 export const PluginCard = (props: Props): JSX.Element => {
 export const PluginCard = (props: Props): JSX.Element => {
+
   const {
   const {
-    name, url, description,
+    id, isEnabled, name, url, description,
   } = props;
   } = props;
 
 
+  const { data } = useSWRxPlugin(id);
+
+  if (data == null) {
+    return <></>;
+  }
+
+  console.log('first', data.data.isEnabled);
   const PluginCardButton = (): JSX.Element => {
   const PluginCardButton = (): JSX.Element => {
-    const [isEnabled, setIsEnabled] = useState(true);
+    const [isEnabled, setState] = useState<boolean>(data.data.isEnabled);
+
+    const onChangeHandler = async() => {
+      // const { data, mutate } = useSWRxPlugin(id);
+
+      console.log('change');
+      const reqUrl = '/plugins-extension/plugin';
+      console.log('id', id);
+      const res = await apiv3Post(reqUrl, { _id: id });
+      console.log(res.data.isEnabled);
+      setState(res.data.isEnabled);
+      // mutate();
+      // return data;
+    };
 
 
     return (
     return (
       <div className={`${styles.plugin_card}`}>
       <div className={`${styles.plugin_card}`}>
@@ -26,7 +53,7 @@ export const PluginCard = (props: Props): JSX.Element => {
             <input
             <input
               type="checkbox"
               type="checkbox"
               className="switch__input"
               className="switch__input"
-              onChange={() => setIsEnabled(!isEnabled)}
+              onChange={() => onChangeHandler()}
               checked={isEnabled}
               checked={isEnabled}
             />
             />
             <span className="switch__content"></span>
             <span className="switch__content"></span>

+ 12 - 1
packages/app/src/components/Admin/PluginsExtension/PluginsExtensionPageContents.tsx

@@ -53,10 +53,21 @@ export const PluginsExtensionPageContents = (): JSX.Element => {
           </h2>
           </h2>
           <div className="d-grid gap-5">
           <div className="d-grid gap-5">
             { data?.data?.plugins.map((item) => {
             { data?.data?.plugins.map((item) => {
+              const pluginId = item[0]._id;
+              const pluginIsEnabled = item[0].isEnabled;
               const pluginName = item[0].meta.name;
               const pluginName = item[0].meta.name;
               const pluginUrl = item[0].origin.url;
               const pluginUrl = item[0].origin.url;
               const pluginDiscription = item[0].meta.desc;
               const pluginDiscription = item[0].meta.desc;
-              return <PluginCard key={item[0]._id} name={pluginName} url={pluginUrl} description={pluginDiscription} />;
+              return (
+                <PluginCard
+                  key={pluginId}
+                  id={pluginId}
+                  isEnabled={pluginIsEnabled}
+                  name={pluginName}
+                  url={pluginUrl}
+                  description={pluginDiscription}
+                />
+              );
             })}
             })}
           </div>
           </div>
         </div>
         </div>

+ 32 - 0
packages/app/src/server/routes/apiv3/plugins-extension.ts

@@ -38,5 +38,37 @@ module.exports = (crowi: Crowi) => {
     }
     }
   });
   });
 
 
+  router.post('/swrplugin', async(req: PluginInstallerFormRequest, res: ApiV3Response) => {
+    if (pluginService == null) {
+      return res.apiv3Err(400);
+    }
+
+    console.log('id2', req.body._id);
+    try {
+      const pluginIsEnabled = await pluginService.switchPluginIsEnabled(req.body._id);
+      console.log('get', pluginIsEnabled);
+      return res.apiv3({ isEnabled: pluginIsEnabled });
+    }
+    catch (err) {
+      return res.apiv3Err(err, 400);
+    }
+  });
+
+  router.post('/plugin', async(req: PluginInstallerFormRequest, res: ApiV3Response) => {
+    if (pluginService == null) {
+      return res.apiv3Err(400);
+    }
+
+    console.log('id2', req.body._id);
+    try {
+      const pluginIsEnabled = await pluginService.switchPluginIsEnabled2(req.body._id);
+      console.log('post', pluginIsEnabled);
+      return res.apiv3({ isEnabled: pluginIsEnabled });
+    }
+    catch (err) {
+      return res.apiv3Err(err, 400);
+    }
+  });
+
   return router;
   return router;
 };
 };

+ 28 - 1
packages/app/src/server/service/plugin.ts

@@ -88,7 +88,7 @@ export class PluginService {
 
 
   async getPlugins(): Promise<any> {
   async getPlugins(): Promise<any> {
     const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
     const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
-    const growiPlugins = await GrowiPlugin.find({ isEnabled: true });
+    const growiPlugins = await GrowiPlugin.find({});
     const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests(growiPlugins);
     const pluginManifestEntries: GrowiPluginManifestEntries = await ActivatePluginService.retrievePluginManifests(growiPlugins);
     return JSON.parse(JSON.stringify(pluginManifestEntries));
     return JSON.parse(JSON.stringify(pluginManifestEntries));
   }
   }
@@ -143,5 +143,32 @@ export class PluginService {
     return [];
     return [];
   }
   }
 
 
+  /**
+   * Switch plugin enabled
+   */
+  async switchPluginIsEnabled(targetPluginId: string): Promise<any> {
+    const GrowiPlugin = await mongoose.model<GrowiPlugin>('GrowiPlugin');
+    const growiPlugins = await GrowiPlugin.find({ _id: targetPluginId });
+    // await growiPlugins[0].update(
+    //   { isEnabled: !growiPlugins[0].isEnabled },
+    // );
+    console.log(growiPlugins);
+    return growiPlugins[0].isEnabled;
+  }
+
+  /**
+   * Switch plugin enabled
+   */
+  async switchPluginIsEnabled2(targetPluginId: string): Promise<any> {
+    const GrowiPlugin = mongoose.model<GrowiPlugin>('GrowiPlugin');
+    const growiPlugins = await GrowiPlugin.find({ _id: targetPluginId });
+    console.log('switch', growiPlugins[0].isEnabled);
+    await growiPlugins[0].update(
+      { isEnabled: !growiPlugins[0].isEnabled },
+    );
+    console.log('switched', growiPlugins[0].isEnabled);
+    return growiPlugins[0].isEnabled;
+  }
+
 
 
 }
 }

+ 35 - 1
packages/app/src/stores/plugin.tsx

@@ -1,7 +1,7 @@
 
 
 import useSWR, { SWRResponse } from 'swr';
 import useSWR, { SWRResponse } from 'swr';
 
 
-import { apiv3Get } from '~/client/util/apiv3-client';
+import { apiv3Get, apiv3Post } from '~/client/util/apiv3-client';
 
 
 // TODO: Correct types
 // TODO: Correct types
 const pluginsFetcher = () => {
 const pluginsFetcher = () => {
@@ -21,3 +21,37 @@ const pluginsFetcher = () => {
 export const useSWRxPlugins = (): SWRResponse<any | null, Error> => {
 export const useSWRxPlugins = (): SWRResponse<any | null, Error> => {
   return useSWR('/pluginsExtension', pluginsFetcher());
   return useSWR('/pluginsExtension', pluginsFetcher());
 };
 };
+
+
+// const repositoryFetcher = (owner: string, repo: string) => {
+//   return async () => {
+//     const reqUrl = `/api/fetch_repository?owner=${owner}&repo=${repo}`
+//     const data = await fetch(reqUrl).then(res => res.json())
+//     return data.searchResultItem
+//   }
+// }
+
+// export const useGitHubRepository = (owner: string, repo: string): SWRResponse<SearchResultItem | null, Error> => {
+//   return useSWR(`${owner}/{repo}`, repositoryFetcher(owner, repo))
+// }
+
+const pluginFetcher = (id: string) => {
+  console.log('featcher', id);
+  return async() => {
+    const reqUrl = '/plugins-extension/swrplugin';
+    try {
+      const data = await apiv3Post(reqUrl, { _id: id });
+      console.log('fetcher');
+      return data;
+    }
+    catch (err) {
+      // TODO: Error handling
+      console.log('aa');
+      console.log('err', err);
+    }
+  };
+};
+
+export const useSWRxPlugin = (_id: string): SWRResponse<any | null, Error> => {
+  return useSWR(`/plugin-${_id}`, pluginFetcher(_id));
+};