@plusscommunities/pluss-circles-web-groups 1.6.2-beta.0 → 1.6.2-beta.2

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,51 +1,47 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-circles-web-groups",
3
- "version": "1.6.2-beta.0",
3
+ "version": "1.6.2-beta.2",
4
4
  "description": "Extension package to enable circles on Pluss Communities Platform",
5
+ "main": "./dist/index.js",
5
6
  "exports": {
6
7
  ".": "./dist/index.js"
7
8
  },
9
+ "files": [
10
+ "dist/"
11
+ ],
8
12
  "scripts": {
9
- "build": "npm i && rollup -c",
13
+ "build": "rollup -c",
14
+ "prepublishOnly": "(cd .. && npm install) && npm run build",
10
15
  "betapatch": "npm version prepatch --preid=beta",
11
16
  "patch": "npm version patch",
12
- "betaupload": "npm run build && npm publish --access public --tag beta && rm -rf node_modules",
17
+ "betaupload": "npm publish --access public --tag beta",
13
18
  "betaupload:p": "npm run betapatch && npm run betaupload",
14
- "upload": "npm run build && npm publish --access public && rm -rf node_modules",
19
+ "upload": "npm publish --access public",
15
20
  "upload:p": "npm run patch && npm run upload",
16
21
  "copy:add": "run(){ ext=${1:-default}; test -f src/values.config.$ext.js || cp src/values.config.default.js src/values.config.$ext.js; }; run",
17
22
  "copy:get": "echo $npm_package_name",
18
23
  "copy:set": "run(){ target='\\@plusscommunities\\/pluss-circles-web'; ext=${1:-default}; [ $ext == 'default' ] && replace=$target || replace=$target'-'$ext; echo 'Setting target to '$replace; test -f src/values.config.$ext.js && cp -f src/values.config.$ext.js src/values.config.js; sed -i'' -e 's/'$target'.*\"/'$replace'\"/g' package.json; }; run",
19
- "copy:betaupload": "npm run betapatch; for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run betaupload; done; npm run copy:set;",
20
- "copy:upload": "npm run patch; for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run upload; done; npm run copy:set;"
24
+ "copy:betaupload": "for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run betaupload; done; npm run copy:set;",
25
+ "copy:betaupload:p": "npm run betapatch; npm run copy:betaupload;",
26
+ "copy:upload": "for file in `ls ./src/values.config.*.js`; do dup=`echo $file | sed 's/.*values\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run upload; done; npm run copy:set;",
27
+ "copy:upload:p": "npm run patch; npm run copy:upload;"
21
28
  },
22
29
  "author": "Phillip Suh",
23
- "license": "ISC",
24
- "devDependencies": {
25
- "@babel/cli": "^7.14.3",
26
- "@babel/core": "^7.14.3",
27
- "@babel/plugin-transform-runtime": "^7.14.3",
28
- "@babel/preset-env": "^7.14.2",
29
- "@babel/preset-react": "^7.13.13",
30
- "@rollup/plugin-babel": "^5.3.0",
31
- "@rollup/plugin-image": "^2.0.6",
32
- "@rollup/plugin-json": "^4.1.0",
33
- "autoprefixer": "^10.2.6",
34
- "rollup": "^2.50.1",
35
- "rollup-plugin-local-resolve": "^1.0.7",
36
- "rollup-plugin-delete": "^3.0.2",
37
- "rollup-plugin-styles": "^3.14.1"
38
- },
39
30
  "dependencies": {
40
31
  "@babel/runtime": "^7.14.0"
41
32
  },
42
33
  "peerDependencies": {
43
34
  "@plusscommunities/pluss-core-web": "*",
35
+ "@plusscommunities/pluss-icons": "*",
44
36
  "lodash": "*",
45
37
  "moment": "*",
46
38
  "react": "*",
47
39
  "react-bootstrap": "*",
48
- "react-dom": "*"
40
+ "react-dom": "*",
41
+ "react-router": "*",
42
+ "react-router-dom": "*",
43
+ "react-redux": "*",
44
+ "react-fontawesome": "*"
49
45
  },
50
46
  "keywords": []
51
47
  }
package/.babelrc DELETED
@@ -1,3 +0,0 @@
1
- {
2
- "presets": ["@babel/preset-react", "@babel/preset-env"]
3
- }
package/rollup.config.js DELETED
@@ -1,59 +0,0 @@
1
- import styles from "rollup-plugin-styles";
2
- const autoprefixer = require("autoprefixer");
3
- import babel from "@rollup/plugin-babel";
4
- import json from "@rollup/plugin-json";
5
- import image from "@rollup/plugin-image";
6
- import resolve from "rollup-plugin-local-resolve";
7
- import del from "rollup-plugin-delete";
8
-
9
- const inputs = [{ input: "src/index.js", filename: "index" }];
10
-
11
- const config = inputs.map((entry, index) => ({
12
- input: entry.input,
13
- output: {
14
- name: "@plusscommunities/pluss-core-web",
15
- file: `dist/${entry.filename}.js`,
16
- format: "esm",
17
- exports: "auto",
18
- },
19
- external: [
20
- "jquery",
21
- "js-cookie",
22
- "lodash",
23
- "moment",
24
- "react",
25
- "react/jsx-runtime",
26
- "react-router",
27
- "react-csv",
28
- "react-bootstrap",
29
- "react-router-dom",
30
- "react-dropzone",
31
- "react-lottie",
32
- "react-redux",
33
- "react-textarea-autosize",
34
- "aws-amplify",
35
- "react-color",
36
- ],
37
- plugins: [
38
- index === 0 ? del({ targets: "dist", runOnce: true }) : null,
39
- resolve({
40
- extensions: [".js", ".jsx"],
41
- browser: true,
42
- }),
43
- babel({
44
- exclude: "node_modules/**",
45
- presets: ["@babel/preset-react", "@babel/preset-env"],
46
- plugins: ["@babel/transform-runtime"],
47
- babelHelpers: "runtime",
48
- }),
49
- styles({
50
- postcss: {
51
- plugins: [autoprefixer()],
52
- },
53
- }),
54
- image(),
55
- json(),
56
- ].filter(Boolean),
57
- }));
58
-
59
- export default config;
@@ -1,23 +0,0 @@
1
- import _ from "lodash";
2
- import { CIRCLES_LOADED, CIRCLE_UPDATED, CIRCLE_REMOVED } from "./types";
3
-
4
- export const circlesLoaded = (circles) => {
5
- return {
6
- type: CIRCLES_LOADED,
7
- payload: circles,
8
- };
9
- };
10
-
11
- export const circleUpdated = (circle) => {
12
- return {
13
- type: CIRCLE_UPDATED,
14
- payload: circle,
15
- };
16
- };
17
-
18
- export const circleRemoved = (circleId) => {
19
- return {
20
- type: CIRCLE_REMOVED,
21
- payload: circleId,
22
- };
23
- };
@@ -1 +0,0 @@
1
- export * from "./CirclesActions";
@@ -1,5 +0,0 @@
1
- import { values } from "../values.config";
2
-
3
- export const CIRCLES_LOADED = `${values.actionCircleKey}S_LOADED`;
4
- export const CIRCLE_UPDATED = `${values.actionCircleKey}_UPDATED`;
5
- export const CIRCLE_REMOVED = `${values.actionCircleKey}_REMOVED`;
@@ -1,126 +0,0 @@
1
- import _ from "lodash";
2
- import { values } from "../values.config";
3
- import { PlussCore } from "../feature.config";
4
- const { Helper, Session } = PlussCore;
5
-
6
- export const circleActions = {
7
- getAll: (site) => {
8
- return Session.authedFunction({
9
- method: "GET",
10
- url: Helper.getUrl(values.serviceKey, "get/all", { site }),
11
- });
12
- },
13
- getFiles: (circleId) => {
14
- return Session.authedFunction({
15
- method: "GET",
16
- url: Helper.getUrl(values.serviceKey, "get/files", { circleId }),
17
- });
18
- },
19
- getImages: (circleId) => {
20
- return Session.authedFunction({
21
- method: "GET",
22
- url: Helper.getUrl(values.serviceKey, "get/images", { circleId }),
23
- });
24
- },
25
- add: (site, title, image, audience, isPublic) => {
26
- return Session.authedFunction({
27
- method: "POST",
28
- url: Helper.getUrl(values.serviceKey, "update/add"),
29
- data: {
30
- site,
31
- title,
32
- image,
33
- audience,
34
- isPublic,
35
- },
36
- });
37
- },
38
- edit: (circleId, title, image, audience, isPublic) => {
39
- return Session.authedFunction({
40
- method: "POST",
41
- url: Helper.getUrl(values.serviceKey, "update/edit"),
42
- data: {
43
- circleId,
44
- title,
45
- image,
46
- audience,
47
- isPublic,
48
- },
49
- });
50
- },
51
- delete: (circleId) => {
52
- return Session.authedFunction({
53
- method: "POST",
54
- url: Helper.getUrl(values.serviceKey, "update/delete"),
55
- data: {
56
- circleId,
57
- },
58
- });
59
- },
60
- addAdmin: (circleId, userId) => {
61
- return Session.authedFunction({
62
- method: "POST",
63
- url: Helper.getUrl(values.serviceKey, "update/addadmin"),
64
- data: {
65
- circleId,
66
- userId,
67
- },
68
- });
69
- },
70
- removeAdmin: (circleId, userId) => {
71
- return Session.authedFunction({
72
- method: "POST",
73
- url: Helper.getUrl(values.serviceKey, "update/removeadmin"),
74
- data: {
75
- circleId,
76
- userId,
77
- },
78
- });
79
- },
80
- getMessages: async (groupId, limit, minTime, maxTime) => {
81
- const query = { groupId };
82
- if (!_.isUndefined(minTime)) {
83
- query.minTime = minTime;
84
- }
85
- if (!_.isUndefined(maxTime)) {
86
- query.maxTime = maxTime;
87
- }
88
- if (limit) {
89
- query.limit = limit;
90
- }
91
- return Session.authedFunction({
92
- method: "GET",
93
- url: Helper.getUrl(values.serviceKey, "getMessages", query),
94
- });
95
- },
96
- sendMessage: async (circleId, message) => {
97
- return Session.authedFunction({
98
- method: "post",
99
- url: Helper.getUrl(values.serviceKey, "sendMessage"),
100
- data: {
101
- groupId: circleId,
102
- message,
103
- },
104
- });
105
- },
106
- deleteMessage: async (messageId, groupId) => {
107
- return Session.authedFunction({
108
- method: "POST",
109
- url: Helper.getUrl(values.serviceKey, "update/deletemessage"),
110
- data: {
111
- messageId,
112
- groupId,
113
- },
114
- });
115
- },
116
- markAsRead: async (circleId, userId) => {
117
- return Session.authedFunction({
118
- method: "post",
119
- url: Helper.getUrl("groups", "resetunread"),
120
- data: {
121
- groupID: circleId,
122
- userID: userId,
123
- },
124
- });
125
- },
126
- };
package/src/apis/index.js DELETED
@@ -1,7 +0,0 @@
1
- import { PlussCore } from "../feature.config";
2
-
3
- const { Apis } = PlussCore;
4
-
5
- export const analyticsActions = Apis.analyticsActions;
6
-
7
- export * from "./circleActions";
@@ -1,284 +0,0 @@
1
- import React, { useState, useEffect } from "react";
2
- import moment from "moment";
3
- import { connect } from "react-redux";
4
- import { analyticsActions } from "../apis";
5
- import { values } from "../values.config";
6
- import { PlussCore } from "../feature.config";
7
-
8
- const { Analytics, Session, Components } = PlussCore;
9
-
10
- const getInitialState = () => ({
11
- isLoading: true,
12
- messages: 0,
13
- prevMessages: 0,
14
- staffMessages: 0,
15
- prevStaffMessages: 0,
16
- residentMessages: 0,
17
- prevResidentMessages: 0,
18
- groupMessages: 0,
19
- prevGroupMessages: 0,
20
- privateMessages: 0,
21
- prevPrivateMessages: 0,
22
- activeGroups: 0,
23
- prevActiveGroups: 0,
24
- });
25
-
26
- // AnalyticsHub Component
27
- const AnalyticsHub = ({
28
- startTime,
29
- endTime,
30
- auth,
31
- prevText,
32
- dayCount,
33
- strings,
34
- }) => {
35
- const [analyticsData, setAnalyticsData] = useState(getInitialState());
36
- const [isExportOpen, setIsExportOpen] = useState(false);
37
-
38
- const hasAccess = Session.validateAccess(
39
- auth.site,
40
- values.permissionNewsletter,
41
- auth,
42
- );
43
- if (!hasAccess) {
44
- return null;
45
- }
46
-
47
- const featureTitle = ((key) => {
48
- if (!strings || !strings.sideNav || !strings.sideNav[key]) {
49
- return values.textFeatureTitle;
50
- }
51
- return strings.sideNav[key];
52
- })();
53
-
54
- const exportColumns = [
55
- { label: "Select All", key: "" },
56
- { label: "Start Date", key: "startDate" },
57
- { label: "End Date", key: "endDate" },
58
- { label: "Messages", key: "messages" },
59
- { label: "Messages by Staff", key: "staffMessages" },
60
- { label: "Messages by Primary Users", key: "residentMessages" },
61
- { label: "Group Messages", key: "groupMessages" },
62
- { label: "Private Messages", key: "privateMessages" },
63
- { label: "Groups with Messages", key: "activeGroups" },
64
- ];
65
-
66
- useEffect(() => {
67
- getData();
68
- }, [startTime, endTime]);
69
-
70
- const getData = async () => {
71
- setAnalyticsData(getInitialState());
72
- // Load analytics data here using startTime and endTime
73
- const timeDifference = endTime - startTime;
74
- const [currentStatsResponse, prevStatsResponse] = await Promise.all([
75
- analyticsActions.getAggregateEntityStats(
76
- auth.site,
77
- values.entityKey,
78
- startTime,
79
- endTime,
80
- true,
81
- ),
82
- analyticsActions.getAggregateEntityStats(
83
- auth.site,
84
- values.entityKey,
85
- startTime - timeDifference,
86
- startTime,
87
- true,
88
- ),
89
- ]);
90
-
91
- const data = {
92
- messages: Analytics.countActivities(
93
- currentStatsResponse.data,
94
- "Message",
95
- "total",
96
- ),
97
- prevMessages: Analytics.countActivities(
98
- prevStatsResponse.data,
99
- "Message",
100
- "total",
101
- ),
102
- staffMessages: Analytics.countActivities(
103
- currentStatsResponse.data,
104
- "StaffMessage",
105
- "total",
106
- ),
107
- prevStaffMessages: Analytics.countActivities(
108
- prevStatsResponse.data,
109
- "StaffMessage",
110
- "total",
111
- ),
112
- residentMessages: Analytics.countActivities(
113
- currentStatsResponse.data,
114
- "ResidentMessage",
115
- "total",
116
- ),
117
- prevResidentMessages: Analytics.countActivities(
118
- prevStatsResponse.data,
119
- "ResidentMessage",
120
- "total",
121
- ),
122
- groupMessages: Analytics.countActivities(
123
- currentStatsResponse.data,
124
- "GroupMessage",
125
- "total",
126
- ),
127
- prevGroupMessages: Analytics.countActivities(
128
- prevStatsResponse.data,
129
- "GroupMessage",
130
- "total",
131
- ),
132
- privateMessages: Analytics.countActivities(
133
- currentStatsResponse.data,
134
- "PrivateMessage",
135
- "total",
136
- ),
137
- prevPrivateMessages: Analytics.countActivities(
138
- prevStatsResponse.data,
139
- "PrivateMessage",
140
- "total",
141
- ),
142
- activeGroups: Analytics.countActivities(
143
- currentStatsResponse.data,
144
- "GroupMessage",
145
- "unique",
146
- ),
147
- prevActiveGroups: Analytics.countActivities(
148
- prevStatsResponse.data,
149
- "GroupMessage",
150
- "unique",
151
- ),
152
- // uniquePageView: Analytics.countActivities(currentStatsResponse.data, 'UniquePageView', 'uniquearray'),
153
- // prevUniquePageView: Analytics.countActivities(prevStatsResponse.data, 'UniquePageView', 'uniquearray'),
154
- isLoading: false,
155
- };
156
- setAnalyticsData(data);
157
- };
158
-
159
- const isReadyToOpenCSV = () => {
160
- return !analyticsData.isLoading;
161
- };
162
-
163
- const getExportSource = () => {
164
- return [
165
- {
166
- startDate: moment(startTime + 1).format("D-MM-YYYY"),
167
- endDate: moment(endTime).format("D-MM-YYYY"),
168
- messages: analyticsData.messages,
169
- staffMessages: analyticsData.staffMessages,
170
- residentMessages: analyticsData.residentMessages,
171
- groupMessages: analyticsData.groupMessages,
172
- privateMessages: analyticsData.privateMessages,
173
- activeGroups: analyticsData.activeGroups,
174
- },
175
- ];
176
- };
177
-
178
- const csvPopup = () => {
179
- if (!isExportOpen) {
180
- return null;
181
- }
182
- const source = getExportSource();
183
- return (
184
- <Components.ExportCsvPopup
185
- onClose={() => {
186
- setIsExportOpen(false);
187
- }}
188
- columns={exportColumns}
189
- source={source}
190
- filename={`${values.analyticsKey}analytics_${source[0].startDate}_${source[0].endDate}.csv`}
191
- />
192
- );
193
- };
194
-
195
- return (
196
- <div className="dashboardSection">
197
- {csvPopup()}
198
- <div>
199
- <Components.Text type="h4" className="inlineBlock marginRight-40">
200
- {featureTitle}
201
- </Components.Text>
202
- <Components.Button
203
- inline
204
- buttonType="primaryAction"
205
- onClick={() => {
206
- if (!isReadyToOpenCSV()) return;
207
- setIsExportOpen(true);
208
- }}
209
- isActive={isReadyToOpenCSV()}
210
- leftIcon="file-code"
211
- >
212
- Export CSV
213
- </Components.Button>
214
- </div>
215
- <div className="analyticsSection dashboardSection_content">
216
- <Components.StatBox
217
- title="Groups with Messages"
218
- icon="fa-user-group"
219
- value={analyticsData.activeGroups}
220
- previousValue={analyticsData.prevActiveGroups}
221
- prevText={prevText}
222
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=GroupMessage&countType=unique&dayCount=${dayCount}`}
223
- isLoading={analyticsData.isLoading}
224
- />
225
- <Components.StatBox
226
- title="Messages"
227
- icon="fa-message"
228
- value={analyticsData.messages}
229
- previousValue={analyticsData.prevMessages}
230
- prevText={prevText}
231
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=Message&countType=total&dayCount=${dayCount}`}
232
- isLoading={analyticsData.isLoading}
233
- />
234
- <Components.StatBox
235
- title="Messages by Staff"
236
- icon="fa-user-tie"
237
- value={analyticsData.staffMessages}
238
- previousValue={analyticsData.prevStaffMessages}
239
- prevText={prevText}
240
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=StaffMessage&countType=total&dayCount=${dayCount}`}
241
- isLoading={analyticsData.isLoading}
242
- />
243
- <Components.StatBox
244
- title="Messages by Primary Users"
245
- icon="fa-users"
246
- value={analyticsData.residentMessages}
247
- previousValue={analyticsData.prevResidentMessages}
248
- prevText={prevText}
249
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=ResidentMessage&countType=total&dayCount=${dayCount}`}
250
- isLoading={analyticsData.isLoading}
251
- />
252
- <Components.StatBox
253
- title="Group Messages"
254
- icon="fa-users-rectangle"
255
- value={analyticsData.groupMessages}
256
- previousValue={analyticsData.prevGroupMessages}
257
- prevText={prevText}
258
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=GroupMessage&countType=total&dayCount=${dayCount}`}
259
- isLoading={analyticsData.isLoading}
260
- />
261
- <Components.StatBox
262
- title="Private Messages"
263
- icon="fa-people-arrows"
264
- value={analyticsData.privateMessages}
265
- previousValue={analyticsData.prevPrivateMessages}
266
- prevText={prevText}
267
- viewGraphLink={`/chart?entity=${values.entityKey}&startTime=${startTime}&endTime=${endTime}&key=PrivateMessage&countType=total&dayCount=${dayCount}`}
268
- isLoading={analyticsData.isLoading}
269
- />
270
- </div>
271
- </div>
272
- );
273
- };
274
-
275
- const mapStateToProps = (state) => {
276
- const { auth } = state;
277
- return {
278
- auth,
279
- strings: (state.strings && state.strings.config) || {},
280
- };
281
- };
282
-
283
- const toExport = connect(mapStateToProps, {})(AnalyticsHub);
284
- export { toExport as AnalyticsHub };
@@ -1,47 +0,0 @@
1
- import React from "react";
2
- import { PlussCore } from "../feature.config";
3
-
4
- const { Components, Colours } = PlussCore;
5
-
6
- export default () => {
7
- return (
8
- <div className="fp2_widget_content fp2_widget_content-circles">
9
- <div className="fp2_widget_content_vListing">
10
- <div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
11
- <Components.Icon
12
- icon={"fa-comments"}
13
- colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
14
- />
15
- </div>
16
- <div className="flex-1">
17
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
18
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
19
- </div>
20
- </div>
21
- <div className="fp2_widget_content_vListing">
22
- <div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
23
- <Components.Icon
24
- icon={"fa-comments"}
25
- colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
26
- />
27
- </div>
28
- <div className="flex-1">
29
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
30
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
31
- </div>
32
- </div>
33
- <div className="fp2_widget_content_vListing">
34
- <div className="fp2_widget_silhouette fp2_widget_silhouette-circle">
35
- <Components.Icon
36
- icon={"fa-comments"}
37
- colour={Colours.hexToRGBAstring(Colours.COLOUR_BRANDING_MAIN, 0.5)}
38
- />
39
- </div>
40
- <div className="flex-1">
41
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLine"></div>
42
- <div className="fp2_widget_silhouette fp2_widget_silhouette-textLineFull"></div>
43
- </div>
44
- </div>
45
- </div>
46
- );
47
- };
@@ -1,29 +0,0 @@
1
- import React, { Component } from "react";
2
- import fullNoTitle from "../images/fullNoTitle.png";
3
-
4
- class PreviewFull extends Component {
5
- render() {
6
- const { backgroundColor, widgetTitle, titleClassName } = this.props;
7
- return (
8
- <div style={styles.container}>
9
- <p className={titleClassName}>{widgetTitle}</p>
10
- <img
11
- style={{ ...styles.image, backgroundColor }}
12
- src={fullNoTitle}
13
- alt="fullNoTitle"
14
- />
15
- </div>
16
- );
17
- }
18
- }
19
-
20
- const styles = {
21
- container: {
22
- position: "relative",
23
- },
24
- image: {
25
- width: "100%",
26
- },
27
- };
28
-
29
- export default PreviewFull;