aboutsummaryrefslogtreecommitdiffstats
path: root/tests/indent/rescript/complex.res
diff options
context:
space:
mode:
Diffstat (limited to 'tests/indent/rescript/complex.res')
-rw-r--r--tests/indent/rescript/complex.res151
1 files changed, 151 insertions, 0 deletions
diff --git a/tests/indent/rescript/complex.res b/tests/indent/rescript/complex.res
new file mode 100644
index 000000000..1f21c3364
--- /dev/null
+++ b/tests/indent/rescript/complex.res
@@ -0,0 +1,151 @@
+let hit = ({hit, children}: DocSearch.hitComponent) => {
+ let toTitle = str =>
+ str->Js.String2.charAt(0)->Js.String2.toUpperCase ++ Js.String2.sliceToEnd(str, ~from=1)
+
+ let description = switch hit.url
+ ->Js.String2.split("/")
+ ->Js.Array2.sliceFrom(1)
+ ->Belt.List.fromArray {
+ | list{"blog" as r | "community" as r, ..._} => r->toTitle
+ | list{"docs", doc, version, ...rest} =>
+ let path = rest->Belt.List.toArray
+
+ let info =
+ path
+ ->Js.Array2.slice(~start=0, ~end_=Js.Array2.length(path) - 1)
+ ->Js.Array2.map(path =>
+ switch path {
+ | "api" => "API"
+ | other => toTitle(other)
+ }
+ )
+
+ [doc->toTitle, version->toTitle]->Js.Array2.concat(info)->Js.Array2.joinWith(" / ")
+ | _ => ""
+ }
+
+ <Next.Link href={hit.url} className="flex flex-col w-full">
+ <span className="text-gray-60 captions px-4 pt-3 pb-1 block">
+ {description->React.string}
+ </span>
+ children
+ </Next.Link>
+}
+
+let transformItems = (items: DocSearch.transformItems) => {
+ items->Belt.Array.keepMap(item => {
+ let url = try Webapi.URL.make(item.url)->Some catch {
+ | Js.Exn.Error(obj) =>
+ Js.Console.error2(`Failed to parse URL ${item.url}`, obj)
+ None
+ }
+ switch url {
+ | Some({pathname, hash}) => {...item, url: pathname ++ hash}->Some
+ | None => None
+ }
+ })
+}
+
+@react.component
+let make = () => {
+ let (state, setState) = React.useState(_ => Inactive)
+ let router = Next.Router.useRouter()
+
+ let version = switch Url.parse(router.route).version {
+ | Version(v) => v
+ | _ => "latest"
+ }
+
+ let handleCloseModal = () => {
+ let () = switch ReactDOM.querySelector(".DocSearch-Modal") {
+ | Some(modal) =>
+ switch ReactDOM.querySelector("body") {
+ | Some(body) =>
+ open Webapi
+ body->Element.classList->ClassList.remove("DocSearch--active")
+ modal->Element.addEventListener("transitionend", () => {
+ setState(_ => Inactive)
+ })
+ | None => setState(_ => Inactive)
+ }
+ | None => ()
+ }
+ }
+
+ React.useEffect(() => {
+ let isEditableTag = el =>
+ switch el->tagName {
+ | "TEXTAREA" | "SELECT" | "INPUT" => true
+ | _ => false
+ }
+
+ let focusSearch = e => {
+ switch activeElement {
+ | Some(el) if el->isEditableTag || el->isContentEditable => ()
+ | _ =>
+ setState(_ => Active)
+ e->keyboardEventPreventDefault
+ }
+ }
+
+ let handleGlobalKeyDown = e => {
+ switch e.key {
+ | "/" => focusSearch(e)
+ | "k" if e.ctrlKey || e.metaKey => focusSearch(e)
+ | "Escape" => handleCloseModal()
+ | _ => ()
+ }
+ }
+ addKeyboardEventListener("keydown", handleGlobalKeyDown)
+ Some(() => removeKeyboardEventListener("keydown", handleGlobalKeyDown))
+ }, [setState])
+
+ let onClick = _ => {
+ setState(_ => Active)
+ }
+
+ let onClose = React.useCallback(() => {
+ handleCloseModal()
+ }, [setState])
+
+ <>
+ <button onClick type_="button" className="text-gray-60 hover:text-fire-50 p-2">
+ <Icon.MagnifierGlass className="fill-current" />
+ </button>
+ {switch state {
+ | Active =>
+ switch ReactDOM.querySelector("body") {
+ | Some(element) =>
+ ReactDOM.createPortal(
+ <DocSearch
+ apiKey
+ appId
+ indexName
+ onClose
+ searchParameters={facetFilters: ["version:" ++ version]}
+ initialScrollY={window->scrollY}
+ transformItems={transformItems}
+ hitComponent=hit
+ />
+ element,
+ )
+ | None => React.null
+ }
+ | Inactive => React.null
+ }}
+ </>
+}
+
+let comparable = (type key, ~cmp) => {
+ module N = MakeComparable({
+ type t = key
+ let cmp = cmp
+ })
+ module(N: Comparable with type t = key)
+}
+
+<Next.Link href={hit.url} className="flex flex-col w-full">
+<span className="text-gray-60 captions px-4 pt-3 pb-1 block">
+ {description->React.string}
+ children
+</Next.Link>