@koine/next 1.0.10 → 1.0.11

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.
Files changed (184) hide show
  1. package/Analytics/AnalyticsGoogle.d.ts +5 -0
  2. package/Analytics/AnalyticsGoogle.js +37 -0
  3. package/Analytics/index.d.ts +1 -0
  4. package/Analytics/index.js +1 -0
  5. package/Analytics/package.json +6 -0
  6. package/Auth/helpers.d.ts +17 -0
  7. package/Auth/helpers.js +21 -0
  8. package/Auth/index.d.ts +4 -0
  9. package/Auth/index.js +4 -0
  10. package/Auth/package.json +6 -0
  11. package/Auth/useLogin.d.ts +7 -0
  12. package/Auth/useLogin.js +50 -0
  13. package/Auth/useLoginUrl.d.ts +1 -0
  14. package/Auth/useLoginUrl.js +11 -0
  15. package/Auth/useLogout.d.ts +6 -0
  16. package/Auth/useLogout.js +52 -0
  17. package/Favicon/Favicon.d.ts +3 -0
  18. package/Favicon/Favicon.js +4 -0
  19. package/Favicon/index.d.ts +1 -0
  20. package/Favicon/index.js +1 -0
  21. package/Favicon/package.json +6 -0
  22. package/Forms/index.d.ts +2 -0
  23. package/Forms/index.js +2 -0
  24. package/Forms/package.json +6 -0
  25. package/Forms/useForm.d.ts +32 -0
  26. package/Forms/useForm.js +37 -0
  27. package/Forms/useSubmit.d.ts +24 -0
  28. package/Forms/useSubmit.js +23 -0
  29. package/Head/Head.d.ts +1 -0
  30. package/Head/Head.js +1 -0
  31. package/Head/index.d.ts +1 -0
  32. package/Head/index.js +1 -0
  33. package/Head/package.json +6 -0
  34. package/I18n/I18n.d.ts +44 -0
  35. package/I18n/I18n.js +74 -0
  36. package/I18n/index.d.ts +1 -0
  37. package/I18n/index.js +1 -0
  38. package/I18n/package.json +6 -0
  39. package/Img/Img.d.ts +21 -0
  40. package/Img/Img.js +28 -0
  41. package/Img/index.d.ts +1 -0
  42. package/Img/index.js +1 -0
  43. package/Img/package.json +6 -0
  44. package/Link/Link.d.ts +9 -0
  45. package/Link/Link.js +9 -0
  46. package/Link/index.d.ts +1 -0
  47. package/Link/index.js +1 -0
  48. package/Link/package.json +6 -0
  49. package/NextProgress/NextProgress.d.ts +24 -0
  50. package/NextProgress/NextProgress.js +37 -0
  51. package/NextProgress/index.d.ts +2 -0
  52. package/NextProgress/index.js +1 -0
  53. package/NextProgress/package.json +6 -0
  54. package/Seo/Seo.d.ts +3 -0
  55. package/Seo/Seo.js +8 -0
  56. package/Seo/SeoDefaults.d.ts +3 -0
  57. package/Seo/SeoDefaults.js +12 -0
  58. package/Seo/helpers.d.ts +48 -0
  59. package/Seo/helpers.js +111 -0
  60. package/Seo/index.d.ts +12 -0
  61. package/Seo/index.js +12 -0
  62. package/Seo/package.json +6 -0
  63. package/Theme/Theme.d.ts +46 -0
  64. package/Theme/Theme.js +235 -0
  65. package/Theme/index.d.ts +1 -0
  66. package/Theme/index.js +1 -0
  67. package/Theme/package.json +6 -0
  68. package/app/AppHead.d.ts +2 -0
  69. package/app/AppHead.js +5 -0
  70. package/app/AppMain.d.ts +35 -0
  71. package/app/AppMain.js +1 -0
  72. package/app/css/AppMain.d.ts +8 -0
  73. package/app/css/AppMain.js +11 -0
  74. package/app/css/AppTheme.d.ts +10 -0
  75. package/app/css/AppTheme.js +12 -0
  76. package/app/css/auth/index.d.ts +9 -0
  77. package/app/css/auth/index.js +13 -0
  78. package/app/css/auth/package.json +6 -0
  79. package/app/css/index.d.ts +54 -0
  80. package/app/css/index.js +57 -0
  81. package/app/css/package.json +6 -0
  82. package/app/em/AppMain.d.ts +10 -0
  83. package/app/em/AppMain.js +22 -0
  84. package/app/em/AppTheme.d.ts +15 -0
  85. package/app/em/AppTheme.js +17 -0
  86. package/app/em/auth/index.d.ts +9 -0
  87. package/app/em/auth/index.js +13 -0
  88. package/app/em/auth/package.json +6 -0
  89. package/app/em/index.d.ts +9 -0
  90. package/app/em/index.js +12 -0
  91. package/app/em/package.json +6 -0
  92. package/app/index.d.ts +2 -0
  93. package/app/index.js +2 -0
  94. package/app/package.json +6 -0
  95. package/app/sc/AppMain.d.ts +10 -0
  96. package/app/sc/AppMain.js +22 -0
  97. package/app/sc/AppTheme.d.ts +13 -0
  98. package/app/sc/AppTheme.js +9 -0
  99. package/app/sc/auth/index.d.ts +9 -0
  100. package/app/sc/auth/index.js +13 -0
  101. package/app/sc/auth/package.json +6 -0
  102. package/app/sc/index.d.ts +56 -0
  103. package/app/sc/index.js +59 -0
  104. package/app/sc/package.json +6 -0
  105. package/config/index.d.ts +71 -0
  106. package/config/index.js +174 -0
  107. package/config/package.json +6 -0
  108. package/document/Document.d.ts +15 -0
  109. package/document/Document.js +19 -0
  110. package/document/css/index.d.ts +22 -0
  111. package/document/css/index.js +30 -0
  112. package/document/css/package.json +6 -0
  113. package/document/em/index.d.ts +16 -0
  114. package/document/em/index.js +68 -0
  115. package/document/em/package.json +6 -0
  116. package/document/index.d.ts +2 -0
  117. package/document/index.js +2 -0
  118. package/document/package.json +6 -0
  119. package/document/sc/index.d.ts +20 -0
  120. package/document/sc/index.js +44 -0
  121. package/document/sc/package.json +6 -0
  122. package/index.d.ts +12 -0
  123. package/index.js +12 -0
  124. package/node/Analytics/AnalyticsGoogle.js +42 -0
  125. package/node/Analytics/index.js +4 -0
  126. package/node/Auth/helpers.js +26 -0
  127. package/node/Auth/index.js +7 -0
  128. package/node/Auth/useLogin.js +54 -0
  129. package/node/Auth/useLoginUrl.js +15 -0
  130. package/node/Auth/useLogout.js +56 -0
  131. package/node/Favicon/Favicon.js +9 -0
  132. package/node/Favicon/index.js +4 -0
  133. package/node/Forms/index.js +5 -0
  134. package/node/Forms/useForm.js +41 -0
  135. package/node/Forms/useSubmit.js +27 -0
  136. package/node/Head/Head.js +8 -0
  137. package/node/Head/index.js +4 -0
  138. package/node/I18n/I18n.js +82 -0
  139. package/node/I18n/index.js +4 -0
  140. package/node/Img/Img.js +34 -0
  141. package/node/Img/index.js +4 -0
  142. package/node/Link/Link.js +13 -0
  143. package/node/Link/index.js +4 -0
  144. package/node/NextProgress/NextProgress.js +41 -0
  145. package/node/NextProgress/index.js +5 -0
  146. package/node/Seo/Seo.js +12 -0
  147. package/node/Seo/SeoDefaults.js +16 -0
  148. package/node/Seo/helpers.js +115 -0
  149. package/node/Seo/index.js +15 -0
  150. package/node/Theme/Theme.js +241 -0
  151. package/node/Theme/index.js +4 -0
  152. package/node/app/AppHead.js +10 -0
  153. package/node/app/AppMain.js +2 -0
  154. package/node/app/css/AppMain.js +16 -0
  155. package/node/app/css/AppTheme.js +16 -0
  156. package/node/app/css/auth/index.js +18 -0
  157. package/node/app/css/index.js +62 -0
  158. package/node/app/em/AppMain.js +26 -0
  159. package/node/app/em/AppTheme.js +22 -0
  160. package/node/app/em/auth/index.js +18 -0
  161. package/node/app/em/index.js +17 -0
  162. package/node/app/index.js +5 -0
  163. package/node/app/sc/AppMain.js +26 -0
  164. package/node/app/sc/AppTheme.js +13 -0
  165. package/node/app/sc/auth/index.js +18 -0
  166. package/node/app/sc/index.js +64 -0
  167. package/node/config/index.js +184 -0
  168. package/node/document/Document.js +24 -0
  169. package/node/document/css/index.js +35 -0
  170. package/node/document/em/index.js +73 -0
  171. package/node/document/index.js +7 -0
  172. package/node/document/sc/index.js +49 -0
  173. package/node/index.js +15 -0
  174. package/node/utils/api.js +38 -0
  175. package/node/utils/emotion-cache.js +13 -0
  176. package/node/utils/index.js +32 -0
  177. package/package.json +4 -7
  178. package/utils/api.d.ts +55 -0
  179. package/utils/api.js +35 -0
  180. package/utils/emotion-cache.d.ts +5 -0
  181. package/utils/emotion-cache.js +8 -0
  182. package/utils/index.d.ts +19 -0
  183. package/utils/index.js +26 -0
  184. package/utils/package.json +6 -0
@@ -0,0 +1,5 @@
1
+ export declare type AnalyticsGoogleProps = {
2
+ /** Falls back to `.env` variable `NEXT_PUBLIC_GTM_ID` */
3
+ id?: string;
4
+ };
5
+ export declare const AnalyticsGoogle: ({ id }: AnalyticsGoogleProps) => JSX.Element | null;
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { useRouter } from "next/router";
4
+ import Script from "next/script";
5
+ import { pageview } from "@koine/utils";
6
+ export const AnalyticsGoogle = ({ id }) => {
7
+ const uid = id || process.env["NEXT_PUBLIC_GTM_ID"];
8
+ const { events, asPath, query } = useRouter();
9
+ const [ready, setReady] = useState(false);
10
+ const [routed, setRouted] = useState(false);
11
+ // const [url, setUrl] = useState("");
12
+ useEffect(() => {
13
+ const handleRouteChange = () => {
14
+ setRouted(true);
15
+ };
16
+ events.on("routeChangeComplete", handleRouteChange);
17
+ return () => {
18
+ events.off("routeChangeComplete", handleRouteChange);
19
+ };
20
+ }, [events]);
21
+ useEffect(() => {
22
+ if (routed && ready && asPath) {
23
+ // const search = query;
24
+ pageview(asPath);
25
+ }
26
+ }, [asPath, query, routed, ready]);
27
+ if (!uid) {
28
+ return null;
29
+ }
30
+ return (_jsxs(_Fragment, { children: [_jsx(Script, { id: "google-tagmanager", src: `https://www.googletagmanager.com/gtag/js?id=${id}`, strategy: "afterInteractive", onLoad: () => setReady(true) }), _jsx(Script, { id: "google-analytics", strategy: "afterInteractive", children: `
31
+ window.dataLayer = window.dataLayer || [];
32
+ function gtag(){window.dataLayer.push(arguments);}
33
+ gtag('js', new Date());
34
+
35
+ gtag('config', '${id}', { 'send_page_view': false });
36
+ ` })] }));
37
+ };
@@ -0,0 +1 @@
1
+ export * from "./AnalyticsGoogle";
@@ -0,0 +1 @@
1
+ export * from "./AnalyticsGoogle";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Analytics/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,17 @@
1
+ import type { Translate } from "../I18n";
2
+ /**
3
+ * @see next/auth `pages` mapping: https://next-auth.js.org/configuration/pages`
4
+ */
5
+ export declare type AuthRoutesMap = {
6
+ login?: string;
7
+ profile?: string;
8
+ register?: string;
9
+ /** Array of regexes to match pathnames of protected routes */
10
+ secured?: RegExp[];
11
+ };
12
+ export declare const AUTH_ROUTES: AuthRoutesMap;
13
+ export declare function getAuthRoutes(t: Translate): AuthRoutesMap;
14
+ /**
15
+ * @param url e.g. "http://localhost:3000/signin?callbackUrl=http://localhost:3000/profile"
16
+ */
17
+ export declare function getCallbackUrl(url?: string): string;
@@ -0,0 +1,21 @@
1
+ import { isString } from "@koine/utils";
2
+ export const AUTH_ROUTES = {
3
+ login: process.env["AUTH_ROUTE_LOGIN"],
4
+ profile: process.env["AUTH_ROUTE_PROFILE"],
5
+ register: process.env["AUTH_ROUTE_REGISTER"],
6
+ secured: JSON.parse(process.env["AUTH_ROUTES_SECURED"] || "[]"),
7
+ };
8
+ export function getAuthRoutes(t) {
9
+ return Object.keys(AUTH_ROUTES).reduce((map, name) => {
10
+ const routePage = AUTH_ROUTES[name];
11
+ // @ts-expect-error cannot remember
12
+ map[name] = isString(routePage) ? t(`~:${AUTH_ROUTES[name]}`) : routePage;
13
+ return map;
14
+ }, {});
15
+ }
16
+ /**
17
+ * @param url e.g. "http://localhost:3000/signin?callbackUrl=http://localhost:3000/profile"
18
+ */
19
+ export function getCallbackUrl(url = window.location.href) {
20
+ return url.split("callbackUrl=")[1] || "";
21
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./helpers";
2
+ export * from "./useLogin";
3
+ export * from "./useLoginUrl";
4
+ export * from "./useLogout";
package/Auth/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./helpers";
2
+ export * from "./useLogin";
3
+ export * from "./useLoginUrl";
4
+ export * from "./useLogout";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Auth/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,7 @@
1
+ import { SubmitHandler } from "react-hook-form";
2
+ export declare function useLogin<LoginForm extends {} = {}>(): {
3
+ submit: SubmitHandler<LoginForm>;
4
+ loading: boolean;
5
+ ok: boolean;
6
+ fail: boolean;
7
+ };
@@ -0,0 +1,50 @@
1
+ import { useState, useCallback } from "react";
2
+ import { useRouter } from "next/router";
3
+ import { signIn } from "next-auth/react";
4
+ import { parseURL } from "@koine/utils";
5
+ import { useT } from "../I18n";
6
+ import { getAuthRoutes, getCallbackUrl } from "./helpers";
7
+ export function useLogin() {
8
+ const t = useT();
9
+ const { push } = useRouter();
10
+ const [loading, setLoading] = useState(false);
11
+ const [ok, setOk] = useState(false);
12
+ const [fail, setFail] = useState(false);
13
+ const submit = useCallback((data) => {
14
+ setLoading(true);
15
+ signIn("credentials", {
16
+ ...data,
17
+ redirect: false,
18
+ })
19
+ // @ts-expect-error FIXME: at some point...
20
+ .then(({ ok }) => {
21
+ setLoading(false);
22
+ setOk(ok);
23
+ setFail(!ok);
24
+ if (ok) {
25
+ const redirectUrl = parseURL(getCallbackUrl());
26
+ const { login, register, profile } = getAuthRoutes(t);
27
+ if (redirectUrl) {
28
+ const redirectPath = redirectUrl.pathname;
29
+ if (profile &&
30
+ (redirectPath === login || redirectPath === register)) {
31
+ push(profile);
32
+ }
33
+ else {
34
+ push(redirectPath + redirectUrl.search);
35
+ }
36
+ }
37
+ else if (profile) {
38
+ push(profile);
39
+ }
40
+ }
41
+ });
42
+ }, [t, push]);
43
+ // TODO: useMemo ?
44
+ return {
45
+ submit,
46
+ loading,
47
+ ok,
48
+ fail,
49
+ };
50
+ }
@@ -0,0 +1 @@
1
+ export declare function useLoginUrl(): string;
@@ -0,0 +1,11 @@
1
+ import { useEffect, useState } from "react";
2
+ import { useT } from "../I18n";
3
+ import { getAuthRoutes } from "./helpers";
4
+ export function useLoginUrl() {
5
+ const [currentUrl, setCurrentUrl] = useState("");
6
+ const t = useT();
7
+ useEffect(() => {
8
+ setCurrentUrl(`?callbackUrl=${window.location.href}`);
9
+ }, []);
10
+ return `${getAuthRoutes(t).login}${currentUrl}`;
11
+ }
@@ -0,0 +1,6 @@
1
+ export declare function useLogout(): {
2
+ submit: (event: React.SyntheticEvent<HTMLFormElement>) => void;
3
+ loading: boolean;
4
+ ok: boolean;
5
+ fail: boolean;
6
+ };
@@ -0,0 +1,52 @@
1
+ import { useState, useCallback } from "react";
2
+ import { useRouter } from "next/router";
3
+ import { signOut } from "next-auth/react";
4
+ import { parseURL } from "@koine/utils";
5
+ import { useT } from "../I18n";
6
+ import { getAuthRoutes, getCallbackUrl } from "./helpers";
7
+ export function useLogout() {
8
+ const t = useT();
9
+ const { push } = useRouter();
10
+ const [loading, setLoading] = useState(false);
11
+ const [ok, setOk] = useState(false);
12
+ const [fail] = useState(false);
13
+ const submit = useCallback((event) => {
14
+ event.preventDefault();
15
+ event.stopPropagation();
16
+ setLoading(true);
17
+ signOut({ redirect: false }).then(() => {
18
+ setLoading(false);
19
+ setOk(true);
20
+ const redirectUrl = parseURL(getCallbackUrl());
21
+ const currentUrl = parseURL(window.location.href);
22
+ const { secured } = getAuthRoutes(t);
23
+ const signin = t("~:/signin");
24
+ const profile = t("~:/profile");
25
+ const targetUrl = redirectUrl || currentUrl;
26
+ let redirect = "";
27
+ if (targetUrl) {
28
+ if (targetUrl.pathname === profile) {
29
+ redirect = signin;
30
+ }
31
+ else if (secured) {
32
+ for (let i = 0; i < secured.length; i++) {
33
+ if (targetUrl.pathname.match(secured[i])) {
34
+ redirect = signin;
35
+ break;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ if (redirect) {
41
+ push(redirect);
42
+ }
43
+ });
44
+ }, [t, push]);
45
+ // TODO: useMemo ?
46
+ return {
47
+ submit,
48
+ loading,
49
+ ok,
50
+ fail,
51
+ };
52
+ }
@@ -0,0 +1,3 @@
1
+ import { FaviconTagsProps } from "@koine/react";
2
+ export declare type FaviconProps = FaviconTagsProps;
3
+ export declare const Favicon: (props: FaviconTagsProps) => JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import Head from "next/head";
3
+ import { FaviconTags } from "@koine/react";
4
+ export const Favicon = (props) => (_jsx(Head, { children: _jsx(FaviconTags, { ...props }) }));
@@ -0,0 +1 @@
1
+ export * from "./Favicon";
@@ -0,0 +1 @@
1
+ export * from "./Favicon";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Favicon/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./useForm";
2
+ export * from "./useSubmit";
package/Forms/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./useForm";
2
+ export * from "./useSubmit";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Forms/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -0,0 +1,32 @@
1
+ import type { UseFormProps, FieldValues } from "react-hook-form";
2
+ import type { ObjectSchema } from "yup";
3
+ import { TranslateNamespace } from "../I18n";
4
+ export declare function useForm<T extends FieldValues>(schema: ObjectSchema<any>, i18nNamespace: TranslateNamespace, formProps?: UseFormProps, debug?: boolean): {
5
+ watch: import("react-hook-form").UseFormWatch<T>;
6
+ getValues: import("react-hook-form").UseFormGetValues<T>;
7
+ getFieldState: import("react-hook-form").UseFormGetFieldState<T>;
8
+ setError: import("react-hook-form").UseFormSetError<T>;
9
+ clearErrors: import("react-hook-form").UseFormClearErrors<T>;
10
+ setValue: import("react-hook-form").UseFormSetValue<T>;
11
+ trigger: import("react-hook-form").UseFormTrigger<T>;
12
+ formState: import("react-hook-form").FormState<T>;
13
+ resetField: import("react-hook-form").UseFormResetField<T>;
14
+ reset: import("react-hook-form").UseFormReset<T>;
15
+ handleSubmit: import("react-hook-form").UseFormHandleSubmit<T>;
16
+ unregister: import("react-hook-form").UseFormUnregister<T>;
17
+ control: import("react-hook-form").Control<T, any>;
18
+ register: import("react-hook-form").UseFormRegister<T>;
19
+ setFocus: import("react-hook-form").UseFormSetFocus<T>;
20
+ field: {
21
+ control: import("react-hook-form").Control<T, any>;
22
+ register: import("react-hook-form").UseFormRegister<T>;
23
+ setValue: import("react-hook-form").UseFormSetValue<T>;
24
+ t: <R extends unknown = string>(s: string, q?: "obj" | {
25
+ [key: string]: string | number | boolean;
26
+ } | null | undefined, o?: "obj" | {
27
+ returnObjects?: boolean | undefined;
28
+ fallback?: string | string[] | undefined;
29
+ default?: string | undefined;
30
+ } | undefined) => R;
31
+ };
32
+ };
@@ -0,0 +1,37 @@
1
+ import { useMemo } from "react";
2
+ import { useForm as _useForm } from "react-hook-form";
3
+ import { yupResolver as resolver } from "@hookform/resolvers/yup";
4
+ import { useT } from "../I18n";
5
+ export function useForm(
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ schema, i18nNamespace, formProps = {}, debug) {
8
+ const t = useT(i18nNamespace);
9
+ // const form = _useForm<InferType<ObjectSchema<T, object>>>({
10
+ const form = _useForm({
11
+ // @ts-expect-error FIXME:
12
+ resolver: resolver(schema),
13
+ // make the form behave more closer as native:
14
+ // shouldUnregister: true,
15
+ ...formProps,
16
+ });
17
+ // const { control, register, setValue } = form;
18
+ // const field = { control, register, setValue, t };
19
+ // if (process.env["NODE_ENV"] !== "production") {
20
+ // if (debug) {
21
+ // console.log(
22
+ // `Form ${i18nNamespace} data`,
23
+ // form.watch(),
24
+ // `errors: `,
25
+ // form.formState.errors
26
+ // );
27
+ // }
28
+ // }
29
+ // if (formProps.mode === "onChange") {
30
+ // return { field, ...form };
31
+ // }
32
+ return useMemo(() => {
33
+ const { control, register, setValue } = form;
34
+ const field = { control, register, setValue, t };
35
+ return { field, ...form };
36
+ }, [t, form]);
37
+ }
@@ -0,0 +1,24 @@
1
+ import type { UnpackNestedValue } from "react-hook-form";
2
+ import { KoineApi } from "../utils/api";
3
+ export declare function useSubmit<RequestBody extends {}, ResponseSuccesfull extends KoineApi.ResponseSuccesfull = {}, ResponseFailed extends KoineApi.ResponseFailed = Record<keyof RequestBody, string | string[]>>(url: string, transformData?: (json: UnpackNestedValue<RequestBody>) => any): {
4
+ submit: (json: any) => Promise<KoineApi.Response<ResponseSuccesfull, ResponseFailed>>;
5
+ loading: boolean;
6
+ } & {
7
+ status: number;
8
+ msg: string;
9
+ } & ({
10
+ ok?: boolean | undefined;
11
+ fail?: boolean | undefined;
12
+ loading: true;
13
+ data?: undefined;
14
+ } | {
15
+ ok: true;
16
+ fail?: false | undefined;
17
+ loading?: false | undefined;
18
+ data: ResponseSuccesfull;
19
+ } | {
20
+ ok?: false | undefined;
21
+ fail: true;
22
+ loading?: false | undefined;
23
+ data: ResponseFailed;
24
+ });
@@ -0,0 +1,23 @@
1
+ import { useAsyncFn } from "@koine/react";
2
+ import { api } from "../utils/api";
3
+ export function useSubmit(url, transformData) {
4
+ const [state, submit] = useAsyncFn(async (json) => {
5
+ if (transformData)
6
+ json = transformData(json);
7
+ const response = await api.post(url, {
8
+ json,
9
+ });
10
+ if (process.env["NODE_ENV"] !== "production") {
11
+ console.log("[@koine/next] useSubmit response", response);
12
+ }
13
+ return response;
14
+ }, [url, transformData]);
15
+ const { loading, error, value } = state;
16
+ const fail = !loading && (!!error || value?.fail);
17
+ return {
18
+ submit,
19
+ loading,
20
+ ...(value || {}),
21
+ fail,
22
+ };
23
+ }
package/Head/Head.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { default as Head } from "next/head";
package/Head/Head.js ADDED
@@ -0,0 +1 @@
1
+ export { default as Head } from "next/head";
@@ -0,0 +1 @@
1
+ export * from "./Head";
package/Head/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./Head";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Head/index.js",
5
+ "types": "./index.d.ts"
6
+ }
package/I18n/I18n.d.ts ADDED
@@ -0,0 +1,44 @@
1
+ /// <reference types="@koine/next/typings" />
2
+ import format from "date-fns/format";
3
+ import type { Option } from "@koine/react";
4
+ export { default as T } from "next-translate/Trans";
5
+ declare type Join<S1, S2> = S1 extends string ? S2 extends string ? `${S1}.${S2}` : never : never;
6
+ declare type Paths<T> = {
7
+ [K in keyof T]: T[K] extends Record<string, unknown> ? Join<K, Paths<T[K]>> : K;
8
+ }[keyof T];
9
+ export declare type AllPaths = {
10
+ [N in keyof Koine.NextTranslations]: {
11
+ [K in keyof Koine.NextTranslations[N]]: Koine.NextTranslations[N][K] extends Array<Record<string, unknown>> ? Join<K extends string ? `${N}:${K}` : `${N}:`, Paths<Koine.NextTranslations[N][K]>> : Koine.NextTranslations[N][K] extends Record<string, unknown> ? Join<K extends string ? `${N}:${K}` : `${N}:`, Paths<Koine.NextTranslations[N][K]>> & Record<Koine.NextTranslations[N][K], object> : Koine.NextTranslations[N][K] extends Array<string | number | boolean> ? Join<K extends string ? `${N}:${K}` : `${N}`, Paths<Koine.NextTranslations[N][K]>> : Koine.NextTranslations[N][K] extends string | number | boolean ? K extends string ? `${N}:${K}` : `${N}:` : ``;
12
+ }[keyof Koine.NextTranslations[N]];
13
+ }[keyof Koine.NextTranslations];
14
+ /**
15
+ * Passing just `obj` is a shortcut for `{ returnObjects: true }`
16
+ */
17
+ declare type TranslationQuery = undefined | null | "obj" | {
18
+ [key: string]: string | number | boolean;
19
+ };
20
+ /**
21
+ * Passing just `obj` is a shortcut for `{ returnObjects: true }`
22
+ */
23
+ declare type TranslationOptions = undefined | "obj" | {
24
+ returnObjects?: boolean;
25
+ fallback?: string | string[];
26
+ default?: string;
27
+ };
28
+ export declare type TranslateNamespace = keyof Koine.NextTranslations;
29
+ export declare type TranslateKey = AllPaths;
30
+ export declare type Translate<N extends undefined | keyof Koine.NextTranslations = undefined> = <R extends unknown = string>(s: N extends TranslateNamespace ? Paths<Koine.NextTranslations[N]> | AllPaths : AllPaths, q?: TranslationQuery, o?: TranslationOptions) => R;
31
+ export declare type TranslateLoose = (s: any, q?: any, o?: any) => string;
32
+ /**
33
+ * FIXME: the use of `useMemo` is a hopefully-temporary solution to fix the FOUC
34
+ * problem of untranslated text during page transitions
35
+ *
36
+ * @see https://github.com/vinissimus/next-translate/issues/513#issuecomment-779826418
37
+ */
38
+ export declare function useT<N extends TranslateNamespace | undefined>(namespace?: N): <R extends unknown = string>(s: N extends TranslateNamespace ? Paths<Koine.NextTranslations[N]> | AllPaths : AllPaths, q?: TranslationQuery, o?: TranslationOptions) => R;
39
+ export declare function translationAsOptions(t: TranslateLoose, i18nKey: string): Option[];
40
+ /**
41
+ * Automatically returns the `date-fns/format` function with the right locale
42
+ * passed as option (grabbed from next router value).
43
+ */
44
+ export declare const useDateFormat: () => typeof format;
package/I18n/I18n.js ADDED
@@ -0,0 +1,74 @@
1
+ /// <reference types="@koine/next/typings" />
2
+ /* eslint-disable @typescript-eslint/no-unnecessary-type-constraint */
3
+ /**
4
+ * @file
5
+ *
6
+ * About the typescript support for translation strings @see:
7
+ * - https://github.com/vinissimus/next-translate/issues/721
8
+ */
9
+ import { useEffect, useState, useMemo } from "react";
10
+ import { useRouter } from "next/router";
11
+ import format from "date-fns/format";
12
+ import useTranslation from "next-translate/useTranslation";
13
+ import { useDateLocale } from "@koine/react";
14
+ export { default as T } from "next-translate/Trans";
15
+ /**
16
+ * FIXME: the use of `useMemo` is a hopefully-temporary solution to fix the FOUC
17
+ * problem of untranslated text during page transitions
18
+ *
19
+ * @see https://github.com/vinissimus/next-translate/issues/513#issuecomment-779826418
20
+ */
21
+ export function useT(namespace) {
22
+ const t = useTranslation().t;
23
+ // const typedT = <
24
+ // // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-constraint
25
+ // R extends unknown = string,
26
+ // // Q extends TranslationQuery = TranslationQuery
27
+ // // O extends TranslationOptions = TranslationOptions
28
+ // >(
29
+ // s: N extends TranslateNamespace
30
+ // ? Paths<Koine.NextTranslations[N]> | AllPaths
31
+ // : AllPaths,
32
+ // q?: TranslationQuery,
33
+ // o?: TranslationOptions
34
+ // ) =>
35
+ // // eslint-disable-next-line
36
+ // t.call(
37
+ // null,
38
+ // namespace ? `${namespace}:${s}` : s,
39
+ // q === "obj" ? null : q,
40
+ // q === "obj" || o === "obj" ? { returnObjects: true } : o
41
+ // // ) as R extends (undefined | never | unknown) ? TranslateReturn<TranslationQuery, TranslationOptions> : R;
42
+ // ) as R;
43
+ // return typedT;
44
+ const tMemoized = useMemo(() => (s, q, o) => t(namespace ? `${namespace}:${s}` : s, q === "obj" ? null : q, q === "obj" || o === "obj" ? { returnObjects: true } : o
45
+ // ) as R extends (undefined | never | unknown) ? TranslateReturn<TranslationQuery, TranslationOptions> : R;
46
+ ), [t, namespace]);
47
+ // return tMemoized as Translate<N>;
48
+ return tMemoized;
49
+ }
50
+ export function translationAsOptions(t, i18nKey) {
51
+ const dictionary = t(i18nKey, undefined, {
52
+ returnObjects: true,
53
+ });
54
+ return Object.keys(dictionary).map((key) => ({
55
+ value: key,
56
+ label: dictionary[key],
57
+ }));
58
+ }
59
+ /**
60
+ * Automatically returns the `date-fns/format` function with the right locale
61
+ * passed as option (grabbed from next router value).
62
+ */
63
+ export const useDateFormat = () => {
64
+ const [formatter, setFormatter] = useState(() => (...args) => format(...args));
65
+ const router = useRouter();
66
+ const locale = useDateLocale(router.locale);
67
+ useEffect(() => {
68
+ if (locale) {
69
+ const newFormatter = (date, _format, options) => format(date, _format, { ...(options || {}), locale });
70
+ setFormatter(() => (...args) => newFormatter(...args));
71
+ }
72
+ }, [locale]);
73
+ return formatter;
74
+ };
@@ -0,0 +1 @@
1
+ export * from "./I18n";
package/I18n/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./I18n";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/I18n/index.js",
5
+ "types": "./index.d.ts"
6
+ }
package/Img/Img.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ import React from "react";
2
+ import NextImage, { ImageProps, StaticImageData } from "next/image";
3
+ import type { KoineImgSmartProps, KoineImgSmartWrapProps } from "@koine/react";
4
+ interface StaticRequire {
5
+ default: StaticImageData;
6
+ }
7
+ declare type StaticImport = StaticRequire | StaticImageData;
8
+ export declare type NextImgProps = Omit<React.ComponentPropsWithoutRef<"img">, "src"> & Omit<ImageProps, "src"> & {
9
+ src: string | StaticImport;
10
+ };
11
+ export declare const NextImg: typeof NextImage;
12
+ export declare type NextImgSmartWrapProps = KoineImgSmartWrapProps;
13
+ export declare type NextImgSmartProps = KoineImgSmartProps & NextImgProps;
14
+ export declare const NextImgSmart: (props: NextImgSmartProps) => JSX.Element;
15
+ export declare function getNextImgProps<T>({ src, alt, layout, blurDataURL, width, height, priority, objectFit, objectPosition, ...restProps }: T & NextImgProps): {
16
+ nextImgProps: NextImgProps;
17
+ restProps: Omit<T & Omit<Pick<React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>, "key" | keyof React.ImgHTMLAttributes<HTMLImageElement>>, "src"> & Omit<ImageProps, "src"> & {
18
+ src: string | StaticImport;
19
+ }, "src" | "alt" | "height" | "width" | "layout" | "priority" | "blurDataURL" | "objectFit" | "objectPosition">;
20
+ };
21
+ export {};
package/Img/Img.js ADDED
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import NextImage from "next/image";
4
+ export const NextImg = NextImage;
5
+ export const NextImgSmart = (props) => {
6
+ const [$loaded, setLoaded] = useState(false);
7
+ const [$error, setError] = useState(false);
8
+ const { nextImgProps, restProps } = getNextImgProps(props);
9
+ const { Wrap } = restProps;
10
+ return nextImgProps.priority ? (_jsx(NextImage, { ...nextImgProps })) : (_jsx(Wrap, { ...restProps, "$loaded": $loaded, "$error": $error, children: _jsx(NextImage, { ...nextImgProps, onLoadingComplete: () => setLoaded(true), onError: () => setError(true) }) }));
11
+ };
12
+ export function getNextImgProps({ src, alt, layout, blurDataURL, width, height, priority, objectFit, objectPosition, ...restProps }) {
13
+ const nextImgProps = {
14
+ src,
15
+ alt,
16
+ layout,
17
+ blurDataURL,
18
+ width,
19
+ height,
20
+ priority,
21
+ objectFit,
22
+ objectPosition,
23
+ };
24
+ return {
25
+ nextImgProps,
26
+ restProps,
27
+ };
28
+ }
package/Img/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "./Img";
package/Img/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from "./Img";
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/Img/index.js",
5
+ "types": "./index.d.ts"
6
+ }