From a74ea0b0cf90a1969c3a4a6b9025a1bcc87f8e21 Mon Sep 17 00:00:00 2001
From: Jose Manuel Serrano Amaut <a20122128@pucp.pe>
Date: Fri, 24 Mar 2023 12:55:11 -0500
Subject: [PATCH] [FEAT]: Add context provider feature to all components

---
 .../components/dropzone/DropzoneRipple.scss   |  4 +--
 .../DropzoneDisabledLayer.scss                |  2 +-
 .../DropzoneDisabledLayer.tsx                 |  2 +-
 .../dropzone/components/dropzone/Dropzone.tsx | 30 ++++++++++++++-----
 .../components/file-card/FileCard.tsx         | 12 ++++++--
 .../file-input-button/FileInputButton.tsx     | 16 +++++++++-
 .../FileMosaicSize/FileMosaicSize.scss        |  2 +-
 .../FileMosaicSize/FileMosaicSize.tsx         |  2 +-
 .../components/file-mosaic/FileMosaic.tsx     | 11 +++++--
 .../UploadingProcess/UploadingProcess.scss    |  8 ++---
 .../UploadingProcess/UploadingProcess.tsx     |  2 +-
 .../material-button/MaterialButton.scss       |  6 +++-
 .../material-button/MaterialButton.tsx        | 17 +++++++++--
 .../material-button/MaterialButtonProps.ts    |  6 ++++
 .../previews/VideoPreview/VideoPreview.scss   |  2 +-
 .../previews/VideoPreview/VideoPreview.tsx    |  2 +-
 .../files-ui-react/utils/ripple/ripple.ts     |  2 +-
 src/files-ui/index.ts                         |  3 +-
 18 files changed, 99 insertions(+), 30 deletions(-)

diff --git a/src/files-ui/components/dropzone/DropzoneRipple.scss b/src/files-ui/components/dropzone/DropzoneRipple.scss
index 0ade087..bf8ff7d 100644
--- a/src/files-ui/components/dropzone/DropzoneRipple.scss
+++ b/src/files-ui/components/dropzone/DropzoneRipple.scss
@@ -1,5 +1,5 @@
 // RIPPLE
-.dropzone-ui-base-ripple-absolute {
+.filesui-base-ripple-absolute {
   position: absolute;
   display: none;
   width: 100%;
@@ -9,7 +9,7 @@
   box-sizing: border-box;
  border-radius: 8px;
  overflow: hidden;
-  .dropzone-ui-base-ripple-relative {
+  .filesui-base-ripple-relative {
     width: 100%;
     height: 100%;
     position: relative;
diff --git a/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.scss b/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.scss
index 928e3f8..f1d0ab5 100644
--- a/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.scss
+++ b/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.scss
@@ -1,4 +1,4 @@
-.dropzone-ui-disabled-root{
+.filesui-disabled-root{
     position: absolute;
     width: 100%;
     height: 100%;
diff --git a/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.tsx b/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.tsx
index 5eb7f2a..e07d351 100644
--- a/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.tsx
+++ b/src/files-ui/components/dropzone/components/DropzoneDisabledLayer/DropzoneDisabledLayer.tsx
@@ -36,7 +36,7 @@ const DropzoneDisabledLayer: React.FC<DropzoneDisabledLayerProps> = (
     handleDropUtil(evt);
   };
   const finalDisabledLayerClassName: string = addClassName(
-    "dropzone-ui-disabled-root",
+    "filesui-disabled-root",
     className
   );
   if (open) {
diff --git a/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx b/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx
index 75f8ea8..8a7bf5b 100644
--- a/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx
+++ b/src/files-ui/components/dropzone/components/dropzone/Dropzone.tsx
@@ -28,6 +28,7 @@ import {
   unexpectedErrorUploadResult,
   getRandomInt,
   addClassName,
+  Localization,
 } from "../../../../core";
 import { mergeProps } from "../../../overridable";
 import InputHidden from "../../../input-hidden/InputHidden";
@@ -54,7 +55,13 @@ import DropzoneHeader from "../DropzoneHeader/DropzoneHeader";
 import DropzoneFooter from "../DropzoneFooter/DropzoneFooter";
 import DropzoneButtons from "../DropzoneButtons/DropzoneButtons";
 import { completeAsureColor } from "../../../../core";
-import { createFuiRippleFromDiv, handleClickInput, handleDragUtil, handleDropUtil } from "../../../../files-ui-react/utils";
+import {
+  createFuiRippleFromDiv,
+  handleClickInput,
+  handleDragUtil,
+  handleDropUtil,
+} from "../../../../files-ui-react/utils";
+import { FilesUiContext } from "../../../../FilesUiProvider/FilesUiContext";
 
 //import { print_manager } from "../../../../../utils";
 
@@ -86,7 +93,7 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => {
     //label
     label,
     //localization
-    localization,
+    localization: locProps,
     //ripple
     disableRipple,
     //drag operations
@@ -113,6 +120,15 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => {
     ...rest
   } = mergeProps(props, defaultDrozoneProps);
 
+  //context
+  const {
+    // darkMode: darkModeContext,
+    //icons,
+    localization: locContext,
+  } = React.useContext(FilesUiContext);
+  const localization: Localization | undefined =
+    locProps !== undefined ? locProps : locContext;
+
   const {
     url,
     method,
@@ -521,14 +537,14 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => {
     //if (isUploading) return;
     let fileList: FileList = evt.target.files as FileList;
     let extFileListOutput: ExtFile[] = fileListToExtFileArray(fileList);
-    //validate dui files
+    //validate ext files
     if (validateFilesFlag) {
       extFileListOutput = outerFuiValidation(extFileListOutput);
       if (autoClean) {
         extFileListOutput = extFileListOutput.filter((f) => f.valid);
       }
     }
-    //init xhr on each dui file
+    //init xhr on each ext file
     if (url) extFileListOutput = toUploadableExtFileList(extFileListOutput);
 
     // Clean input element to trigger onChange event on input
@@ -646,7 +662,7 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => {
       }
     }
 
-    //init xhr on each dui file
+    //init xhr on each ext file
     if (url) extFileListOutput = toUploadableExtFileList(extFileListOutput);
 
     handleFilesChange(extFileListOutput);
@@ -723,12 +739,12 @@ const Dropzone: React.FC<DropzoneProps> = (props: DropzoneProps) => {
         {!disableRipple && (
           <div
             ref={fuiRippleRefAbs}
-            className="dropzone-ui-base-ripple-absolute"
+            className="filesui-base-ripple-absolute"
             style={{ borderRadius: style?.borderRadius }}
           >
             <div
               ref={fuiRippleRefRel}
-              className="dropzone-ui-base-ripple-relative"
+              className="filesui-base-ripple-relative"
             ></div>
           </div>
         )}
diff --git a/src/files-ui/components/file-card/FileCard.tsx b/src/files-ui/components/file-card/FileCard.tsx
index 9dbd635..69d27de 100644
--- a/src/files-ui/components/file-card/FileCard.tsx
+++ b/src/files-ui/components/file-card/FileCard.tsx
@@ -6,6 +6,7 @@ import "./components/FileCardPaper.scss";
 import {
   fileSizeFormater,
   getLocalFileItemData,
+  Localization,
   //handleClickUtil,
   shrinkWord,
 } from "../../core";
@@ -84,7 +85,7 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => {
 
     xhr,
 
-    localization,
+    localization:locProps,
     preview,
     imageUrl,
     videoUrl,
@@ -115,9 +116,16 @@ const FileCard: React.FC<FileCardProps> = (props: FileCardProps) => {
     //} = mergeProps(props, FileCardPropsDefault);
   } = props;
   //context
-  const { darkMode: darkModeContext, icons } = React.useContext(FilesUiContext);
+  const {
+    darkMode: darkModeContext,
+    icons,
+    localization: locContext,
+  } = React.useContext(FilesUiContext);
+  const localization: Localization | undefined =
+    locProps !== undefined ? locProps : locContext;
   const darkMode: boolean | undefined =
     darkModeProp !== undefined ? darkModeProp : darkModeContext;
+  console.log("globalConfig", darkMode, icons);
 
   //ref for anchor element
   const downloadRef = React.useRef<HTMLAnchorElement>(null);
diff --git a/src/files-ui/components/file-input-button/FileInputButton.tsx b/src/files-ui/components/file-input-button/FileInputButton.tsx
index 4f257e1..d300d8c 100644
--- a/src/files-ui/components/file-input-button/FileInputButton.tsx
+++ b/src/files-ui/components/file-input-button/FileInputButton.tsx
@@ -14,6 +14,7 @@ import {
   instantPreparingToUploadOne,
   isUploadAbleExtFile,
   isValidateActive,
+  Localization,
   LocalLabels,
   sanitizeArrExtFile,
   sleepPreparing,
@@ -26,6 +27,7 @@ import {
   validateExtFileList,
 } from "../../core";
 import { handleClickInput } from "../../files-ui-react/utils";
+import { FilesUiContext } from "../../FilesUiProvider/FilesUiContext";
 import useDropzoneFileListUpdater from "../../hooks/useDropzoneFileUpdater";
 import { DropzoneActions } from "../dropzone/components/dropzone/DropzoneProps";
 import DropzoneButtons from "../dropzone/components/DropzoneButtons/DropzoneButtons";
@@ -68,7 +70,7 @@ const FileInputButton: React.FC<FileInputButtonProps> = (
     //label
     label,
     //localization
-    localization,
+    localization: locProps,
     //ripple
     disableRipple,
     //action butotns
@@ -91,8 +93,19 @@ const FileInputButton: React.FC<FileInputButtonProps> = (
 
     variant,
     resetStyles,
+    darkMode: darkModeProp,
     ...rest
   } = mergeProps(props, defaultFileInputButtonProps);
+  //context
+  const {
+    darkMode: darkModeContext,
+    //icons,
+    localization: locContext,
+  } = React.useContext(FilesUiContext);
+  const localization: Localization | undefined =
+    locProps !== undefined ? locProps : locContext;
+  const darkMode: boolean | undefined =
+    darkModeProp !== undefined ? darkModeProp : darkModeContext;
 
   const {
     url,
@@ -518,6 +531,7 @@ const FileInputButton: React.FC<FileInputButtonProps> = (
         resetStyles={resetStyles}
         onClick={handleClick}
         disableRipple={disableRipple}
+        darkMode={darkMode}
         {...rest}
       >
         {children || label}
diff --git a/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.scss b/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.scss
index 46f865f..3501786 100644
--- a/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.scss
+++ b/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.scss
@@ -1,4 +1,4 @@
-.dui-file-item-size {
+.filesui-file-item-size {
   box-sizing: border-box;
   font-size: 0.7rem;
   border: 0.5px solid wheat;
diff --git a/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.tsx b/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.tsx
index 2f7ba08..6230e29 100644
--- a/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.tsx
+++ b/src/files-ui/components/file-mosaic/components/FileMosaicSize/FileMosaicSize.tsx
@@ -10,7 +10,7 @@ const FileMosaicSize: React.FC<FileItemSizeProps> = (
   return (
     <React.Fragment>
       {sizeFormatted && (
-        <div className="dui-file-item-size">{sizeFormatted}</div>
+        <div className="filesui-file-item-size">{sizeFormatted}</div>
       )}
     </React.Fragment>
   );
diff --git a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx
index a80ff71..2113dab 100644
--- a/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx
+++ b/src/files-ui/components/file-mosaic/components/file-mosaic/FileMosaic.tsx
@@ -3,6 +3,7 @@ import {
   addClassName,
   fileSizeFormater,
   getLocalFileItemData,
+  Localization,
   //handleClickUtil,
 } from "../../../../core";
 import "./FileMosaic.scss";
@@ -43,7 +44,7 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => {
 
     xhr,
 
-    localization,
+    localization: locProps,
     preview,
     imageUrl,
     videoUrl,
@@ -72,7 +73,13 @@ const FileMosaic: React.FC<FileMosaicProps> = (props: FileMosaicProps) => {
   } = props;
 
   //context
-  const { darkMode: darkModeContext, icons } = React.useContext(FilesUiContext);
+  const {
+    darkMode: darkModeContext,
+    icons,
+    localization: locContext,
+  } = React.useContext(FilesUiContext);
+  const localization: Localization | undefined =
+    locProps !== undefined ? locProps : locContext;
   const darkMode: boolean | undefined =
     darkModeProp !== undefined ? darkModeProp : darkModeContext;
   console.log("globalConfig", darkMode, icons);
diff --git a/src/files-ui/components/icons/UploadingProcess/UploadingProcess.scss b/src/files-ui/components/icons/UploadingProcess/UploadingProcess.scss
index d67ed16..7ec1e8e 100644
--- a/src/files-ui/components/icons/UploadingProcess/UploadingProcess.scss
+++ b/src/files-ui/components/icons/UploadingProcess/UploadingProcess.scss
@@ -1,4 +1,4 @@
-@keyframes dui-rotate-spin {
+@keyframes filesui-rotate-spin {
   from {
     transform: rotate(0deg);
   }
@@ -7,12 +7,12 @@
     transform: rotate(360deg);
   }
 }
-.dui-rotate {
+.filesui-rotate {
   cursor: default;
 }
 
 @media (prefers-reduced-motion: no-preference) {
-  .dui-rotate {
-    animation: dui-rotate-spin infinite 2s linear;
+  .filesui-rotate {
+    animation: filesui-rotate-spin infinite 2s linear;
   }
 }
diff --git a/src/files-ui/components/icons/UploadingProcess/UploadingProcess.tsx b/src/files-ui/components/icons/UploadingProcess/UploadingProcess.tsx
index e829b0b..51534c0 100644
--- a/src/files-ui/components/icons/UploadingProcess/UploadingProcess.tsx
+++ b/src/files-ui/components/icons/UploadingProcess/UploadingProcess.tsx
@@ -17,7 +17,7 @@ const UploadingProcess: FC<UploadingProcessProps> = (
   const finalSize = parseSize(size);
   const finalStyle = style ? style : {};
   let finalClassname = className || "";
-  finalClassname += spin ? "dui-rotate" : "";
+  finalClassname += spin ? "filesui-rotate" : "";
   return (
     <svg
       className={finalClassname}
diff --git a/src/files-ui/components/material-button/MaterialButton.scss b/src/files-ui/components/material-button/MaterialButton.scss
index 42f4a4c..bb4ad51 100644
--- a/src/files-ui/components/material-button/MaterialButton.scss
+++ b/src/files-ui/components/material-button/MaterialButton.scss
@@ -87,6 +87,10 @@ span.ripple {
   background-color: rgba(0, 0, 0, 0.12);
   color: rgba(0, 0, 0, 0.26);
   padding: 6px 16px;
+  &.darkmode {
+    background-color: rgba(255, 255, 255, 0.12);
+    color: rgba(255, 255, 255, 0.3);
+  }
 }
 
 //mobile
@@ -104,4 +108,4 @@ span.ripple {
     padding: 4px 12px;
   }
 }
- */
\ No newline at end of file
+ */
diff --git a/src/files-ui/components/material-button/MaterialButton.tsx b/src/files-ui/components/material-button/MaterialButton.tsx
index 0ec05de..ba5be5e 100644
--- a/src/files-ui/components/material-button/MaterialButton.tsx
+++ b/src/files-ui/components/material-button/MaterialButton.tsx
@@ -3,6 +3,8 @@ import useMaterialButtonClassName from "./hooks/useMaterialButtonClassName";
 import { MaterialButtonProps } from "./MaterialButtonProps";
 import "./MaterialButton.scss";
 import { createRippleButton } from "../../files-ui-react/utils";
+import { addClassName } from "../../core";
+import { FilesUiContext } from "../../FilesUiProvider/FilesUiContext";
 
 const MaterialButton: React.FC<MaterialButtonProps> = (
   props: MaterialButtonProps
@@ -20,7 +22,13 @@ const MaterialButton: React.FC<MaterialButtonProps> = (
     onClick,
     resetStyles,
     disableRipple,
+    darkMode: darkModeProp,
   } = props;
+  //context
+  const { darkMode: darkModeContext } = React.useContext(FilesUiContext);
+  const darkMode: boolean | undefined =
+    darkModeProp !== undefined ? darkModeProp : darkModeContext;
+
 
   const idClassName = React.useId();
 
@@ -35,7 +43,12 @@ const MaterialButton: React.FC<MaterialButtonProps> = (
       idClassName.replaceAll(":", ""),
       resetStyles
     );
+  const finalMBClassNameDarkMode: string | undefined = materialButtonClassName && darkMode
+    ? addClassName(materialButtonClassName, `darkmode`)
+    : materialButtonClassName;
+
 
+    console.log("finalMBClassNameDarkMode", finalMBClassNameDarkMode, darkMode);
   function handleClick<T extends HTMLAnchorElement | HTMLButtonElement>(
     e: React.MouseEvent<T, MouseEvent>
   ): void {
@@ -48,9 +61,9 @@ const MaterialButton: React.FC<MaterialButtonProps> = (
     onClick?.(e as React.MouseEvent<HTMLButtonElement, MouseEvent>);
   }
 
-  if (materialButtonClassName !== undefined || resetStyles)
+  if (finalMBClassNameDarkMode !== undefined || resetStyles)
     return React.createElement(href ? "a" : "button", {
-      className: resetStyles && className ? className : materialButtonClassName,
+      className: resetStyles && className ? className : finalMBClassNameDarkMode,
       "data-testid": href ? "dui-anchor" : "dui-button",
       onClick: handleClick,
       href: href,
diff --git a/src/files-ui/components/material-button/MaterialButtonProps.ts b/src/files-ui/components/material-button/MaterialButtonProps.ts
index 72225f1..d6aa971 100644
--- a/src/files-ui/components/material-button/MaterialButtonProps.ts
+++ b/src/files-ui/components/material-button/MaterialButtonProps.ts
@@ -44,6 +44,12 @@ export interface MaterialButtonPropsInterface extends OverridableComponentProps
    */
   disableRipple?: boolean;
 
+
+      /**
+    * If true, dark mode colors are used in the component.
+    */
+      darkMode?: boolean;
+
 }
 type DefButtonPropsMap = React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>;
 
diff --git a/src/files-ui/components/previews/VideoPreview/VideoPreview.scss b/src/files-ui/components/previews/VideoPreview/VideoPreview.scss
index 77ad929..f869011 100644
--- a/src/files-ui/components/previews/VideoPreview/VideoPreview.scss
+++ b/src/files-ui/components/previews/VideoPreview/VideoPreview.scss
@@ -1,4 +1,4 @@
-.dui-video-preview {
+.filesui-video-preview {
   position: relative;
   border-radius: 10px;
   transition: transform 0.3s 0.2s;
diff --git a/src/files-ui/components/previews/VideoPreview/VideoPreview.tsx b/src/files-ui/components/previews/VideoPreview/VideoPreview.tsx
index aa82a06..e9dab37 100644
--- a/src/files-ui/components/previews/VideoPreview/VideoPreview.tsx
+++ b/src/files-ui/components/previews/VideoPreview/VideoPreview.tsx
@@ -54,7 +54,7 @@ const VideoPreview: React.FC<VideoPreviewProps> = (
           id="files-ui-video"
           //controls={controls}
           ref={videoRef}
-          className={className || "dui-video-preview"}
+          className={className || "filesui-video-preview"}
           //autoPlay={autoplay}
           src={source}
           //width={"100%"}
diff --git a/src/files-ui/files-ui-react/utils/ripple/ripple.ts b/src/files-ui/files-ui-react/utils/ripple/ripple.ts
index 28a73f3..d461a68 100644
--- a/src/files-ui/files-ui-react/utils/ripple/ripple.ts
+++ b/src/files-ui/files-ui-react/utils/ripple/ripple.ts
@@ -21,7 +21,7 @@ export function createFuiRippleFromDiv
   // creating the span circle ripple
   const circle: HTMLSpanElement = document.createElement("span");
   //for searching
-  circle.id = "dui-ripple";
+  circle.id = "filesui-ripple";
   //for styles
   circle.className = "ripple";
   // calculates the diameter
diff --git a/src/files-ui/index.ts b/src/files-ui/index.ts
index f409f80..741e988 100644
--- a/src/files-ui/index.ts
+++ b/src/files-ui/index.ts
@@ -51,7 +51,8 @@ export type {
     ServerResponse,
     UploadResponse,
     UploadConfig,
-    ValidateFileResponse
+    ValidateFileResponse,
+    IconsMap
 } from "./core";
 
 
-- 
GitLab