@capytale/meta-player 0.2.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@capytale/meta-player",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "scripts": {
6
6
  "dev": "vite",
@@ -13,6 +13,11 @@
13
13
  "lint:fix": "eslint --fix .",
14
14
  "type-check": "tsc --noEmit"
15
15
  },
16
+ "overrides": {
17
+ "use-file-upload": {
18
+ "react": "^18.3.1"
19
+ }
20
+ },
16
21
  "dependencies": {
17
22
  "@capytale/activity.js": "^3.1.0",
18
23
  "@capytale/capytale-anti-triche": "^0.2.1",
@@ -23,7 +28,8 @@
23
28
  "primereact": "^10.8.3",
24
29
  "react-html-props": "^2.0.9",
25
30
  "react-redux": "^9.1.0",
26
- "screenfull": "^6.0.2"
31
+ "screenfull": "^6.0.2",
32
+ "use-file-upload": "^1.0.11"
27
33
  },
28
34
  "devDependencies": {
29
35
  "@testing-library/dom": "^9.3.4",
package/src/demo.tsx CHANGED
@@ -15,11 +15,13 @@ const DemoActivity: FC = () => {
15
15
  <ActivityQuickActionsSetter
16
16
  actions={[
17
17
  {
18
+ type: "action",
18
19
  title: "Pause",
19
20
  icon: "pi pi-pause",
20
21
  action: () => console.log("Pause"),
21
22
  },
22
23
  {
24
+ type: "action",
23
25
  title: "Play",
24
26
  icon: "pi pi-play",
25
27
  action: () => console.log("Play"),
@@ -29,11 +31,13 @@ const DemoActivity: FC = () => {
29
31
  <ActivitySidebarActionsSetter
30
32
  actions={[
31
33
  {
34
+ type: "action",
32
35
  title: "Pause",
33
36
  icon: "pi pi-pause",
34
37
  action: () => console.log("Pause"),
35
38
  },
36
39
  {
40
+ type: "action",
37
41
  title: "Play",
38
42
  icon: "pi pi-play",
39
43
  action: () => console.log("Play"),
@@ -133,7 +133,7 @@ export const useActivityJsEssentials = () => {
133
133
  //@ts-expect-error
134
134
  return ab.activityNode.content.value as string | null;
135
135
  };
136
- const getAssignentContent = () => {
136
+ const getAssignmentContent = () => {
137
137
  if (!ab.assignmentNode) {
138
138
  throw new Error("No assignment node");
139
139
  }
@@ -173,10 +173,12 @@ export const useActivityJsEssentials = () => {
173
173
  //@ts-expect-error
174
174
  ab.assignmentNode.binaryData.value = data;
175
175
  };
176
+ const hasAssignment = !!ab.assignmentNode;
176
177
  return {
177
178
  mode,
179
+ hasAssignment,
178
180
  getActivityContent,
179
- getAssignentContent,
181
+ getAssignmentContent,
180
182
  getActivityBinaryData,
181
183
  getAssignmentBinaryData,
182
184
  setActivityContent,
@@ -4,12 +4,14 @@ import {
4
4
  QuickAction,
5
5
  selectQuickActions,
6
6
  setQuickActions,
7
+ usePerformQuickAction,
7
8
  } from "./navbarSlice";
8
9
  import { Button } from "primereact/button";
9
10
  import settings from "../../settings";
10
11
 
11
12
  const ActivityQuickActions: FC<{}> = () => {
12
13
  const quickActions = useAppSelector(selectQuickActions);
14
+ const performQuickAction = usePerformQuickAction();
13
15
  return (
14
16
  <>
15
17
  {quickActions.map((action) => (
@@ -18,7 +20,9 @@ const ActivityQuickActions: FC<{}> = () => {
18
20
  severity="secondary"
19
21
  size="small"
20
22
  icon={action.icon}
21
- onClick={action.action}
23
+ onClick={() => {
24
+ performQuickAction(action);
25
+ }}
22
26
  outlined
23
27
  tooltip={action.title}
24
28
  tooltipOptions={{
@@ -4,12 +4,14 @@ import {
4
4
  QuickAction,
5
5
  selectSidebarActions,
6
6
  setSidebarActions,
7
+ usePerformQuickAction,
7
8
  } from "./navbarSlice";
8
9
  import { Button } from "primereact/button";
9
10
  import settings from "../../settings";
10
11
 
11
12
  const ActivitySidebarActions: FC<{}> = () => {
12
13
  const sidebarActions = useAppSelector(selectSidebarActions);
14
+ const performQuickAction = usePerformQuickAction();
13
15
  return (
14
16
  <>
15
17
  {sidebarActions.map((action) => (
@@ -18,7 +20,9 @@ const ActivitySidebarActions: FC<{}> = () => {
18
20
  severity="secondary"
19
21
  size="small"
20
22
  icon={action.icon}
21
- onClick={action.action}
23
+ onClick={() => {
24
+ performQuickAction(action);
25
+ }}
22
26
  outlined
23
27
  label={action.title}
24
28
  tooltipOptions={{
@@ -1,11 +1,39 @@
1
1
  import type { PayloadAction } from "@reduxjs/toolkit";
2
2
  import { createAppSlice } from "../../app/createAppSlice";
3
+ import { Callback, useFileUpload } from "use-file-upload";
4
+ export type QuickAction =
5
+ | {
6
+ type: "action";
7
+ title: string;
8
+ icon: string;
9
+ action: () => void;
10
+ }
11
+ | {
12
+ type: "file-upload";
13
+ accept?: string;
14
+ title: string;
15
+ icon: string;
16
+ action: (file: {
17
+ source: URL;
18
+ name: string;
19
+ size: number;
20
+ file: File;
21
+ }) => void;
22
+ };
3
23
 
4
- export type QuickAction = {
5
- title: string;
6
- icon: string;
7
- action: () => void;
8
- };
24
+ export function usePerformQuickAction() {
25
+ const [_, selectFile] = useFileUpload();
26
+ return (action: QuickAction) => {
27
+ if (action.type === "action") {
28
+ action.action();
29
+ } else if (action.type === "file-upload") {
30
+ selectFile(
31
+ { accept: action.accept, multiple: false },
32
+ action.action as Callback,
33
+ );
34
+ }
35
+ };
36
+ }
9
37
 
10
38
  export interface NavbarState {
11
39
  quickActions: QuickAction[];