@harkly/react 0.1.0 → 0.2.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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type ComponentPropsWithoutRef, type ReactNode } from "react";
2
- import { HarklyClient, type FeedbackOptions, type HarklyUser, type IdentifyOptions, type InitOptions, type MessengerOptions, type UpdatesOptions } from "@harkly/js";
2
+ import { HarklyClient, type FeedbackOptions, type HarklyUser, type IdentifyOptions, type InitOptions, type MessengerOptions, type SurveyOptions, type UpdatesOptions } from "@harkly/js";
3
3
  export declare function HarklyProvider({ children, user, identifyOptions, ...options }: InitOptions & {
4
4
  children: ReactNode;
5
5
  user?: HarklyUser | null;
@@ -14,3 +14,10 @@ export declare function useUnreadUpdates(): number;
14
14
  export declare function ChangelogBadge({ theme, onClick, children, ...rest }: ComponentPropsWithoutRef<"button"> & UpdatesOptions): import("react").JSX.Element;
15
15
  /** Mounts the messenger launcher while rendered; re-mounts when the user changes so the thread follows them. */
16
16
  export declare function Messenger(options: MessengerOptions): null;
17
+ /** Asks once per mount (and again when the user changes) whether a survey is due, and shows it. */
18
+ export declare function Surveys(options: SurveyOptions): null;
19
+ /** A button that opens one survey by slug. */
20
+ export declare function SurveyButton({ slug, theme, onClick, children, ...rest }: ComponentPropsWithoutRef<"button"> & {
21
+ slug: string;
22
+ theme?: SurveyOptions["theme"];
23
+ }): import("react").JSX.Element;
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{createContext as Y,useContext as Z,useEffect as R,useMemo as _,useState as T}from"react";import{HarklyClient as $}from"@harkly/js";import{jsxDEV as L}from"react/jsx-dev-runtime";var W=Y(null);function M({children:A,user:q,identifyOptions:F,...z}){let B=_(()=>new $(z),[z.publicKey,z.apiUrl,z.portalUrl,z.anonymous]);return R(()=>{if(q?.id)B.identify(q,F).catch(()=>{});else B.reset()},[B,q?.id,q?.email,q?.name,q?.plan,q?.mrr,F?.jwt]),L(W.Provider,{value:B,children:A},void 0,!1,void 0,this)}function Q(){let A=Z(W);if(!A)throw Error("Harkly: wrap your app in <HarklyProvider publicKey=…>");return A}function P({board:A,title:q,theme:F,onPosted:z,onClick:B,children:I,...J}){let K=Q();return L("button",{type:"button",...J,onClick:(G)=>{B?.(G),K.feedback({board:A,title:q,theme:F,onPosted:z})},children:I??"Send feedback"},void 0,!1,void 0,this)}function N(){let A=Q(),[q,F]=T(0);return R(()=>{let z=!0;return A.unread().then((B)=>{if(z)F(B)}).catch(()=>{}),()=>{z=!1}},[A,A.user?.id]),q}function U({theme:A,onClick:q,children:F,...z}){let B=Q(),I=N(),[J,K]=T(0),G=Math.max(0,I-J);return L("button",{type:"button",...z,onClick:(X)=>{q?.(X),K(I),B.updates({theme:A})},"aria-label":G?`What's new, ${G} unread`:"What's new",children:[F??"What's new",G>0&&L("span",{"data-harkly-badge":!0,children:G},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function w(A){let q=Q(),{position:F,launcher:z,theme:B,color:I}=A;return R(()=>{let J,K=!0;return q.messenger({position:F,launcher:z,theme:B,color:I}).then((G)=>{if(K)J=G;else G.destroy()}).catch(()=>{}),()=>{K=!1,J?.destroy()}},[q,q.user?.id,F,z,B,I]),null}export{N as useUnreadUpdates,Q as useHarkly,w as Messenger,M as HarklyProvider,P as FeedbackButton,U as ChangelogBadge};
1
+ import{createContext as Y,useContext as Z,useEffect as R,useMemo as _,useState as T}from"react";import{HarklyClient as $}from"@harkly/js";import{jsxDEV as Q}from"react/jsx-dev-runtime";var W=Y(null);function P({children:z,user:q,identifyOptions:F,...w}){let B=_(()=>new $(w),[w.publicKey,w.apiUrl,w.portalUrl,w.anonymous]);return R(()=>{if(q?.id)B.identify(q,F).catch(()=>{});else B.reset()},[B,q?.id,q?.email,q?.name,q?.plan,q?.mrr,F?.jwt]),Q(W.Provider,{value:B,children:z},void 0,!1,void 0,this)}function L(){let z=Z(W);if(!z)throw Error("Harkly: wrap your app in <HarklyProvider publicKey=…>");return z}function U({board:z,title:q,theme:F,onPosted:w,onClick:B,children:G,...J}){let K=L();return Q("button",{type:"button",...J,onClick:(I)=>{B?.(I),K.feedback({board:z,title:q,theme:F,onPosted:w})},children:G??"Send feedback"},void 0,!1,void 0,this)}function A(){let z=L(),[q,F]=T(0);return R(()=>{let w=!0;return z.unread().then((B)=>{if(w)F(B)}).catch(()=>{}),()=>{w=!1}},[z,z.user?.id]),q}function g({theme:z,onClick:q,children:F,...w}){let B=L(),G=A(),[J,K]=T(0),I=Math.max(0,G-J);return Q("button",{type:"button",...w,onClick:(X)=>{q?.(X),K(G),B.updates({theme:z})},"aria-label":I?`What's new, ${I} unread`:"What's new",children:[F??"What's new",I>0&&Q("span",{"data-harkly-badge":!0,children:I},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function S(z){let q=L(),{position:F,launcher:w,theme:B,color:G}=z;return R(()=>{let J,K=!0;return q.messenger({position:F,launcher:w,theme:B,color:G}).then((I)=>{if(K)J=I;else I.destroy()}).catch(()=>{}),()=>{K=!1,J?.destroy()}},[q,q.user?.id,F,w,B,G]),null}function b(z){let q=L(),{position:F,theme:w,onComplete:B,onDismiss:G}=z;return R(()=>{q.surveys({position:F,theme:w,onComplete:B,onDismiss:G}).catch(()=>{})},[q,q.user?.id,F,w,B,G]),null}function O({slug:z,theme:q,onClick:F,children:w,...B}){let G=L();return Q("button",{type:"button",...B,onClick:(J)=>{F?.(J),G.survey(z,{theme:q})},children:w??"Take the survey"},void 0,!1,void 0,this)}export{A as useUnreadUpdates,L as useHarkly,b as Surveys,O as SurveyButton,S as Messenger,P as HarklyProvider,U as FeedbackButton,g as ChangelogBadge};
2
2
 
3
- //# debugId=865BFF16C834754464756E2164756E21
3
+ //# debugId=FEDC32B51E5C618464756E2164756E21
4
4
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../src/index.tsx"],
4
4
  "sourcesContent": [
5
- "// Thin React bindings over @harkly/js. The SDK keeps all the state; these\n// components only call it.\nimport { createContext, useContext, useEffect, useMemo, useState, type ComponentPropsWithoutRef, type ReactNode } from \"react\";\nimport { HarklyClient, type FeedbackOptions, type HarklyUser, type IdentifyOptions, type InitOptions, type MessengerOptions, type UpdatesOptions } from \"@harkly/js\";\n\nconst HarklyContext = createContext<HarklyClient | null>(null);\n\nexport function HarklyProvider({ children, user, identifyOptions, ...options }: InitOptions & { children: ReactNode; user?: HarklyUser | null; identifyOptions?: IdentifyOptions }) {\n const client = useMemo(() => new HarklyClient(options), [options.publicKey, options.apiUrl, options.portalUrl, options.anonymous]);\n useEffect(() => {\n if (user?.id) void client.identify(user, identifyOptions).catch(() => {});\n else client.reset();\n }, [client, user?.id, user?.email, user?.name, user?.plan, user?.mrr, identifyOptions?.jwt]);\n return <HarklyContext.Provider value={client}>{children}</HarklyContext.Provider>;\n}\n\nexport function useHarkly(): HarklyClient {\n const c = useContext(HarklyContext);\n if (!c) throw new Error(\"Harkly: wrap your app in <HarklyProvider publicKey=…>\");\n return c;\n}\n\nexport function FeedbackButton({ board, title, theme, onPosted, onClick, children, ...rest }: ComponentPropsWithoutRef<\"button\"> & FeedbackOptions & { onPosted?: (postId: string) => void }) {\n const harkly = useHarkly();\n return (\n <button type=\"button\" {...rest} onClick={(e) => { onClick?.(e); void harkly.feedback({ board, title, theme, onPosted }); }}>\n {children ?? \"Send feedback\"}\n </button>\n );\n}\n\n/** Polls the unread count on mount and whenever the user changes; renders nothing when it's zero. */\nexport function useUnreadUpdates(): number {\n const harkly = useHarkly();\n const [n, setN] = useState(0);\n useEffect(() => {\n let live = true;\n harkly.unread().then((v) => { if (live) setN(v); }).catch(() => {});\n return () => { live = false; };\n }, [harkly, harkly.user?.id]);\n return n;\n}\n\nexport function ChangelogBadge({ theme, onClick, children, ...rest }: ComponentPropsWithoutRef<\"button\"> & UpdatesOptions) {\n const harkly = useHarkly();\n const unread = useUnreadUpdates();\n const [seen, setSeen] = useState(0);\n const count = Math.max(0, unread - seen);\n return (\n <button type=\"button\" {...rest} onClick={(e) => { onClick?.(e); setSeen(unread); void harkly.updates({ theme }); }} aria-label={count ? `What's new, ${count} unread` : \"What's new\"}>\n {children ?? \"What's new\"}\n {count > 0 && <span data-harkly-badge>{count}</span>}\n </button>\n );\n}\n\n/** Mounts the messenger launcher while rendered; re-mounts when the user changes so the thread follows them. */\nexport function Messenger(options: MessengerOptions) {\n const harkly = useHarkly();\n const { position, launcher, theme, color } = options;\n useEffect(() => {\n let handle: { destroy: () => void } | undefined;\n let live = true;\n harkly.messenger({ position, launcher, theme, color }).then((h) => { if (live) handle = h; else h.destroy(); }).catch(() => {});\n return () => { live = false; handle?.destroy(); };\n }, [harkly, harkly.user?.id, position, launcher, theme, color]);\n return null;\n}\n"
5
+ "// Thin React bindings over @harkly/js. The SDK keeps all the state; these\n// components only call it.\nimport { createContext, useContext, useEffect, useMemo, useState, type ComponentPropsWithoutRef, type ReactNode } from \"react\";\nimport { HarklyClient, type FeedbackOptions, type HarklyUser, type IdentifyOptions, type InitOptions, type MessengerOptions, type SurveyOptions, type UpdatesOptions } from \"@harkly/js\";\n\nconst HarklyContext = createContext<HarklyClient | null>(null);\n\nexport function HarklyProvider({ children, user, identifyOptions, ...options }: InitOptions & { children: ReactNode; user?: HarklyUser | null; identifyOptions?: IdentifyOptions }) {\n const client = useMemo(() => new HarklyClient(options), [options.publicKey, options.apiUrl, options.portalUrl, options.anonymous]);\n useEffect(() => {\n if (user?.id) void client.identify(user, identifyOptions).catch(() => {});\n else client.reset();\n }, [client, user?.id, user?.email, user?.name, user?.plan, user?.mrr, identifyOptions?.jwt]);\n return <HarklyContext.Provider value={client}>{children}</HarklyContext.Provider>;\n}\n\nexport function useHarkly(): HarklyClient {\n const c = useContext(HarklyContext);\n if (!c) throw new Error(\"Harkly: wrap your app in <HarklyProvider publicKey=…>\");\n return c;\n}\n\nexport function FeedbackButton({ board, title, theme, onPosted, onClick, children, ...rest }: ComponentPropsWithoutRef<\"button\"> & FeedbackOptions & { onPosted?: (postId: string) => void }) {\n const harkly = useHarkly();\n return (\n <button type=\"button\" {...rest} onClick={(e) => { onClick?.(e); void harkly.feedback({ board, title, theme, onPosted }); }}>\n {children ?? \"Send feedback\"}\n </button>\n );\n}\n\n/** Polls the unread count on mount and whenever the user changes; renders nothing when it's zero. */\nexport function useUnreadUpdates(): number {\n const harkly = useHarkly();\n const [n, setN] = useState(0);\n useEffect(() => {\n let live = true;\n harkly.unread().then((v) => { if (live) setN(v); }).catch(() => {});\n return () => { live = false; };\n }, [harkly, harkly.user?.id]);\n return n;\n}\n\nexport function ChangelogBadge({ theme, onClick, children, ...rest }: ComponentPropsWithoutRef<\"button\"> & UpdatesOptions) {\n const harkly = useHarkly();\n const unread = useUnreadUpdates();\n const [seen, setSeen] = useState(0);\n const count = Math.max(0, unread - seen);\n return (\n <button type=\"button\" {...rest} onClick={(e) => { onClick?.(e); setSeen(unread); void harkly.updates({ theme }); }} aria-label={count ? `What's new, ${count} unread` : \"What's new\"}>\n {children ?? \"What's new\"}\n {count > 0 && <span data-harkly-badge>{count}</span>}\n </button>\n );\n}\n\n/** Mounts the messenger launcher while rendered; re-mounts when the user changes so the thread follows them. */\nexport function Messenger(options: MessengerOptions) {\n const harkly = useHarkly();\n const { position, launcher, theme, color } = options;\n useEffect(() => {\n let handle: { destroy: () => void } | undefined;\n let live = true;\n harkly.messenger({ position, launcher, theme, color }).then((h) => { if (live) handle = h; else h.destroy(); }).catch(() => {});\n return () => { live = false; handle?.destroy(); };\n }, [harkly, harkly.user?.id, position, launcher, theme, color]);\n return null;\n}\n\n/** Asks once per mount (and again when the user changes) whether a survey is due, and shows it. */\nexport function Surveys(options: SurveyOptions) {\n const harkly = useHarkly();\n const { position, theme, onComplete, onDismiss } = options;\n useEffect(() => {\n void harkly.surveys({ position, theme, onComplete, onDismiss }).catch(() => {});\n }, [harkly, harkly.user?.id, position, theme, onComplete, onDismiss]);\n return null;\n}\n\n/** A button that opens one survey by slug. */\nexport function SurveyButton({ slug, theme, onClick, children, ...rest }: ComponentPropsWithoutRef<\"button\"> & { slug: string; theme?: SurveyOptions[\"theme\"] }) {\n const harkly = useHarkly();\n return (\n <button type=\"button\" {...rest} onClick={(e) => { onClick?.(e); void harkly.survey(slug, { theme }); }}>\n {children ?? \"Take the survey\"}\n </button>\n );\n}\n"
6
6
  ],
7
- "mappings": "AAEA,wBAAS,gBAAe,eAAY,aAAW,cAAS,cACxD,uBAAS,kEAET,IAAM,EAAgB,EAAmC,IAAI,EAEtD,SAAS,CAAc,EAAG,WAAU,OAAM,qBAAoB,GAA+G,CAClL,IAAM,EAAS,EAAQ,IAAM,IAAI,EAAa,CAAO,EAAG,CAAC,EAAQ,UAAW,EAAQ,OAAQ,EAAQ,UAAW,EAAQ,SAAS,CAAC,EAKjI,OAJA,EAAU,IAAM,CACd,GAAI,GAAM,GAAS,EAAO,SAAS,EAAM,CAAe,EAAE,MAAM,IAAM,EAAE,EACnE,OAAO,MAAM,GACjB,CAAC,EAAQ,GAAM,GAAI,GAAM,MAAO,GAAM,KAAM,GAAM,KAAM,GAAM,IAAK,GAAiB,GAAG,CAAC,EACpF,EAAmD,EAAc,SAAjE,CAAwB,MAAO,EAA/B,SAAwC,GAAxC,qBAAmD,EAGrD,SAAS,CAAS,EAAiB,CACxC,IAAM,EAAI,EAAW,CAAa,EAClC,GAAI,CAAC,EAAG,MAAU,MAAM,uDAAsD,EAC9E,OAAO,EAGF,SAAS,CAAc,EAAG,QAAO,QAAO,QAAO,WAAU,UAAS,cAAa,GAAwG,CAC5L,IAAM,EAAS,EAAU,EACzB,OACE,EAEE,SAFF,CAAQ,KAAK,YAAa,EAAM,QAAS,CAAC,IAAM,CAAE,IAAU,CAAC,EAAQ,EAAO,SAAS,CAAE,QAAO,QAAO,QAAO,UAAS,CAAC,GAAtH,SACG,GAAY,iBADf,qBAEE,EAKC,SAAS,CAAgB,EAAW,CACzC,IAAM,EAAS,EAAU,GAClB,EAAG,GAAQ,EAAS,CAAC,EAM5B,OALA,EAAU,IAAM,CACd,IAAI,EAAO,GAEX,OADA,EAAO,OAAO,EAAE,KAAK,CAAC,IAAM,CAAE,GAAI,EAAM,EAAK,CAAC,EAAI,EAAE,MAAM,IAAM,EAAE,EAC3D,IAAM,CAAE,EAAO,KACrB,CAAC,EAAQ,EAAO,MAAM,EAAE,CAAC,EACrB,EAGF,SAAS,CAAc,EAAG,QAAO,UAAS,cAAa,GAA6D,CACzH,IAAM,EAAS,EAAU,EACnB,EAAS,EAAiB,GACzB,EAAM,GAAW,EAAS,CAAC,EAC5B,EAAQ,KAAK,IAAI,EAAG,EAAS,CAAI,EACvC,OACE,EAGE,SAHF,CAAQ,KAAK,YAAa,EAAM,QAAS,CAAC,IAAM,CAAE,IAAU,CAAC,EAAG,EAAQ,CAAM,EAAQ,EAAO,QAAQ,CAAE,OAAM,CAAC,GAAM,aAAY,EAAQ,eAAe,WAAiB,aAAxK,SAGE,CAFC,GAAY,aACZ,EAAQ,GAAK,EAAiC,OAAjC,CAAM,oBAAiB,GAAvB,SAAyB,GAAzB,qBAAiC,IAFjD,qBAGE,EAKC,SAAS,CAAS,CAAC,EAA2B,CACnD,IAAM,EAAS,EAAU,GACjB,WAAU,WAAU,QAAO,SAAU,EAO7C,OANA,EAAU,IAAM,CACd,IAAI,EACA,EAAO,GAEX,OADA,EAAO,UAAU,CAAE,WAAU,WAAU,QAAO,OAAM,CAAC,EAAE,KAAK,CAAC,IAAM,CAAE,GAAI,EAAM,EAAS,EAAQ,OAAE,QAAQ,EAAI,EAAE,MAAM,IAAM,EAAE,EACvH,IAAM,CAAE,EAAO,GAAO,GAAQ,QAAQ,IAC5C,CAAC,EAAQ,EAAO,MAAM,GAAI,EAAU,EAAU,EAAO,CAAK,CAAC,EACvD",
8
- "debugId": "865BFF16C834754464756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "FEDC32B51E5C618464756E2164756E21",
9
9
  "names": []
10
10
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@harkly/react",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "React bindings for the Harkly SDK: a provider, a feedback button and a what's-new badge.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -24,7 +24,7 @@
24
24
  "test": "bun test"
25
25
  },
26
26
  "dependencies": {
27
- "@harkly/js": "0.1.0"
27
+ "@harkly/js": "workspace:*"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "react": ">=18"