@burdenoff/microfe-devportal 2026.921.1 → 2026.1006.1

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.
@@ -47,7 +47,7 @@ var d = ({ open: d, onOpenChange: f, onConfirm: p, title: m, description: h, con
47
47
  }
48
48
  }[v === "destructive" ? "danger" : v], k = () => f(!1);
49
49
  return /* @__PURE__ */ u("div", {
50
- className: "fixed inset-0 z-50 flex items-center justify-center",
50
+ className: "fixed inset-0 z-50 flex items-center justify-center pt-[3.5rem]",
51
51
  children: [/* @__PURE__ */ l("button", {
52
52
  type: "button",
53
53
  "aria-label": "Close dialog backdrop",
@@ -60,7 +60,7 @@ var d = ({ open: d, onOpenChange: f, onConfirm: p, title: m, description: h, con
60
60
  "aria-labelledby": x,
61
61
  "aria-describedby": h || b ? S : void 0,
62
62
  tabIndex: -1,
63
- className: "relative z-10 w-full max-w-md rounded-lg bg-bg-surface p-6 shadow-xl",
63
+ className: "relative z-10 flex max-h-[calc(100dvh-3.5rem-2rem)] w-full max-w-md flex-col overflow-y-auto rounded-lg bg-bg-surface p-6 shadow-xl",
64
64
  children: [/* @__PURE__ */ u("div", {
65
65
  className: "flex items-start gap-4",
66
66
  children: [/* @__PURE__ */ l("div", {
@@ -1 +1 @@
1
- {"version":3,"file":"ConfirmDialog.js","names":[],"sources":["../../../src/devportal/components/ConfirmDialog.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type FC, type ReactNode } from \"react\";\nimport { AlertTriangle, Info, CheckCircle, XCircle } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../utils/i18n\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => void | Promise<void>;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\" | \"warning\" | \"success\" | \"destructive\";\n loading?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Confirmation dialog component\n */\nexport const ConfirmDialog: FC<ConfirmDialogProps> = ({\n open,\n onOpenChange,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n loading = false,\n children,\n}) => {\n const titleId = useId();\n const descriptionId = useId();\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const confirmButtonRef = useRef<HTMLButtonElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const tr = useTr();\n\n // Keep a stable ref to the latest onOpenChange. Parents commonly pass an\n // inline arrow (new reference every render), so depending on it directly\n // would re-run the focus effect on every keystroke and yank focus away from\n // form inputs. Storing it in a ref lets the effect depend only on open/loading.\n const onOpenChangeRef = useRef(onOpenChange);\n useEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n }, [onOpenChange]);\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n // For form dialogs (with children), focus the container so Tab naturally\n // walks through the form fields first. Only auto-focus the confirm button\n // for simple confirmation dialogs that have no form fields.\n const focusTarget = children\n ? dialogRef.current\n : (confirmButtonRef.current ?? dialogRef.current);\n window.requestAnimationFrame(() => {\n focusTarget?.focus();\n });\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && !loading) {\n event.preventDefault();\n onOpenChangeRef.current(false);\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.removeEventListener(\"keydown\", onKeyDown);\n previousFocusRef.current?.focus();\n };\n // children is intentionally omitted: it re-creates every render and would\n // re-trigger focus-stealing on each keystroke. Only open/loading gate this.\n }, [loading, open]);\n\n if (!open) return null;\n\n // Map 'destructive' to 'danger' for internal use\n const normalizedVariant = variant === \"destructive\" ? \"danger\" : variant;\n\n const variantStyles = {\n default: {\n icon: <Info className=\"h-6 w-6 text-accent-blue\" />,\n iconBg: \"bg-status-info-bg-subtle\",\n button:\n \"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90\",\n },\n danger: {\n icon: <XCircle className=\"h-6 w-6 text-status-error-text\" />,\n iconBg: \"bg-status-error-bg-subtle\",\n button: \"bg-status-error-bg text-white hover:bg-status-error-bg/90\",\n },\n warning: {\n icon: <AlertTriangle className=\"h-6 w-6 text-status-warning-text\" />,\n iconBg: \"bg-status-warning-bg-subtle\",\n button: \"bg-status-warning-bg text-white hover:bg-status-warning-bg/90\",\n },\n success: {\n icon: <CheckCircle className=\"h-6 w-6 text-status-success-text\" />,\n iconBg: \"bg-status-success-bg-subtle\",\n button: \"bg-status-success-bg text-white hover:bg-status-success-bg/90\",\n },\n };\n\n const styles = variantStyles[normalizedVariant];\n\n const handleClose = () => onOpenChange(false);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n {/* Backdrop */}\n <button\n type=\"button\"\n aria-label=\"Close dialog backdrop\"\n className=\"absolute inset-0 bg-bg-overlay\"\n onClick={handleClose}\n />\n\n {/* Dialog */}\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description || children ? descriptionId : undefined}\n tabIndex={-1}\n className=\"relative z-10 w-full max-w-md rounded-lg bg-bg-surface p-6 shadow-xl\"\n >\n <div className=\"flex items-start gap-4\">\n <div className={cn(\"rounded-full p-2\", styles.iconBg)}>\n {styles.icon}\n </div>\n <div className=\"flex-1\">\n <h3 id={titleId} className=\"text-lg font-semibold\">\n {title}\n </h3>\n {description && (\n <p\n id={descriptionId}\n className=\"mt-2 text-sm text-text-secondary\"\n >\n {description}\n </p>\n )}\n {children && (\n <div\n className=\"mt-4\"\n id={description ? undefined : descriptionId}\n >\n {children}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={loading}\n className=\"rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button\n ref={confirmButtonRef}\n type=\"button\"\n onClick={onConfirm}\n disabled={loading}\n className={cn(\n \"rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50\",\n styles.button,\n )}\n >\n {loading\n ? tr(\"devportal.processing\", \"Processing...\")\n : confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Alert banner component\n */\nexport const Alert: FC<{\n variant?: \"info\" | \"warning\" | \"error\" | \"success\";\n title?: string;\n children: ReactNode;\n onDismiss?: () => void;\n className?: string;\n}> = ({ variant = \"info\", title, children, onDismiss, className }) => {\n const variantStyles = {\n info: \"bg-status-info-bg-subtle border-border-subtle text-status-info-text\",\n warning:\n \"bg-status-warning-bg-subtle border-border-subtle text-status-warning-text\",\n error:\n \"bg-status-error-bg-subtle border-border-subtle text-status-error-text\",\n success:\n \"bg-status-success-bg-subtle border-border-subtle text-status-success-text\",\n };\n\n const icons = {\n info: <Info className=\"h-5 w-5\" />,\n warning: <AlertTriangle className=\"h-5 w-5\" />,\n error: <XCircle className=\"h-5 w-5\" />,\n success: <CheckCircle className=\"h-5 w-5\" />,\n };\n\n return (\n <div\n className={cn(\"rounded-lg border p-4\", variantStyles[variant], className)}\n >\n <div className=\"flex items-start gap-3\">\n {icons[variant]}\n <div className=\"flex-1\">\n {title && <h4 className=\"font-medium\">{title}</h4>}\n <div className=\"text-sm\">{children}</div>\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"hover:opacity-70\"\n >\n <XCircle className=\"h-5 w-5\" />\n </button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"ConfirmDialog.js","names":[],"sources":["../../../src/devportal/components/ConfirmDialog.tsx"],"sourcesContent":["import { useEffect, useId, useRef, type FC, type ReactNode } from \"react\";\nimport { AlertTriangle, Info, CheckCircle, XCircle } from \"lucide-react\";\nimport { cn } from \"../utils/cn\";\nimport { useTr } from \"../utils/i18n\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onConfirm: () => void | Promise<void>;\n title: string;\n description?: string;\n confirmLabel?: string;\n cancelLabel?: string;\n variant?: \"default\" | \"danger\" | \"warning\" | \"success\" | \"destructive\";\n loading?: boolean;\n children?: ReactNode;\n}\n\n/**\n * Confirmation dialog component\n */\nexport const ConfirmDialog: FC<ConfirmDialogProps> = ({\n open,\n onOpenChange,\n onConfirm,\n title,\n description,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n loading = false,\n children,\n}) => {\n const titleId = useId();\n const descriptionId = useId();\n const dialogRef = useRef<HTMLDivElement | null>(null);\n const confirmButtonRef = useRef<HTMLButtonElement | null>(null);\n const previousFocusRef = useRef<HTMLElement | null>(null);\n const tr = useTr();\n\n // Keep a stable ref to the latest onOpenChange. Parents commonly pass an\n // inline arrow (new reference every render), so depending on it directly\n // would re-run the focus effect on every keystroke and yank focus away from\n // form inputs. Storing it in a ref lets the effect depend only on open/loading.\n const onOpenChangeRef = useRef(onOpenChange);\n useEffect(() => {\n onOpenChangeRef.current = onOpenChange;\n }, [onOpenChange]);\n\n useEffect(() => {\n if (!open) {\n return undefined;\n }\n\n previousFocusRef.current = document.activeElement as HTMLElement | null;\n const originalOverflow = document.body.style.overflow;\n document.body.style.overflow = \"hidden\";\n\n // For form dialogs (with children), focus the container so Tab naturally\n // walks through the form fields first. Only auto-focus the confirm button\n // for simple confirmation dialogs that have no form fields.\n const focusTarget = children\n ? dialogRef.current\n : (confirmButtonRef.current ?? dialogRef.current);\n window.requestAnimationFrame(() => {\n focusTarget?.focus();\n });\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\" && !loading) {\n event.preventDefault();\n onOpenChangeRef.current(false);\n }\n };\n\n document.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.body.style.overflow = originalOverflow;\n document.removeEventListener(\"keydown\", onKeyDown);\n previousFocusRef.current?.focus();\n };\n // children is intentionally omitted: it re-creates every render and would\n // re-trigger focus-stealing on each keystroke. Only open/loading gate this.\n }, [loading, open]);\n\n if (!open) return null;\n\n // Map 'destructive' to 'danger' for internal use\n const normalizedVariant = variant === \"destructive\" ? \"danger\" : variant;\n\n const variantStyles = {\n default: {\n icon: <Info className=\"h-6 w-6 text-accent-blue\" />,\n iconBg: \"bg-status-info-bg-subtle\",\n button:\n \"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90\",\n },\n danger: {\n icon: <XCircle className=\"h-6 w-6 text-status-error-text\" />,\n iconBg: \"bg-status-error-bg-subtle\",\n button: \"bg-status-error-bg text-white hover:bg-status-error-bg/90\",\n },\n warning: {\n icon: <AlertTriangle className=\"h-6 w-6 text-status-warning-text\" />,\n iconBg: \"bg-status-warning-bg-subtle\",\n button: \"bg-status-warning-bg text-white hover:bg-status-warning-bg/90\",\n },\n success: {\n icon: <CheckCircle className=\"h-6 w-6 text-status-success-text\" />,\n iconBg: \"bg-status-success-bg-subtle\",\n button: \"bg-status-success-bg text-white hover:bg-status-success-bg/90\",\n },\n };\n\n const styles = variantStyles[normalizedVariant];\n\n const handleClose = () => onOpenChange(false);\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center pt-[3.5rem]\">\n {/* Backdrop */}\n <button\n type=\"button\"\n aria-label=\"Close dialog backdrop\"\n className=\"absolute inset-0 bg-bg-overlay\"\n onClick={handleClose}\n />\n\n {/* Dialog */}\n <div\n ref={dialogRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description || children ? descriptionId : undefined}\n tabIndex={-1}\n className=\"relative z-10 flex max-h-[calc(100dvh-3.5rem-2rem)] w-full max-w-md flex-col overflow-y-auto rounded-lg bg-bg-surface p-6 shadow-xl\"\n >\n <div className=\"flex items-start gap-4\">\n <div className={cn(\"rounded-full p-2\", styles.iconBg)}>\n {styles.icon}\n </div>\n <div className=\"flex-1\">\n <h3 id={titleId} className=\"text-lg font-semibold\">\n {title}\n </h3>\n {description && (\n <p\n id={descriptionId}\n className=\"mt-2 text-sm text-text-secondary\"\n >\n {description}\n </p>\n )}\n {children && (\n <div\n className=\"mt-4\"\n id={description ? undefined : descriptionId}\n >\n {children}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"mt-6 flex justify-end gap-3\">\n <button\n type=\"button\"\n onClick={handleClose}\n disabled={loading}\n className=\"rounded-md border px-4 py-2 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50\"\n >\n {cancelLabel}\n </button>\n <button\n ref={confirmButtonRef}\n type=\"button\"\n onClick={onConfirm}\n disabled={loading}\n className={cn(\n \"rounded-md px-4 py-2 text-sm font-medium transition-colors disabled:opacity-50\",\n styles.button,\n )}\n >\n {loading\n ? tr(\"devportal.processing\", \"Processing...\")\n : confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n};\n\n/**\n * Alert banner component\n */\nexport const Alert: FC<{\n variant?: \"info\" | \"warning\" | \"error\" | \"success\";\n title?: string;\n children: ReactNode;\n onDismiss?: () => void;\n className?: string;\n}> = ({ variant = \"info\", title, children, onDismiss, className }) => {\n const variantStyles = {\n info: \"bg-status-info-bg-subtle border-border-subtle text-status-info-text\",\n warning:\n \"bg-status-warning-bg-subtle border-border-subtle text-status-warning-text\",\n error:\n \"bg-status-error-bg-subtle border-border-subtle text-status-error-text\",\n success:\n \"bg-status-success-bg-subtle border-border-subtle text-status-success-text\",\n };\n\n const icons = {\n info: <Info className=\"h-5 w-5\" />,\n warning: <AlertTriangle className=\"h-5 w-5\" />,\n error: <XCircle className=\"h-5 w-5\" />,\n success: <CheckCircle className=\"h-5 w-5\" />,\n };\n\n return (\n <div\n className={cn(\"rounded-lg border p-4\", variantStyles[variant], className)}\n >\n <div className=\"flex items-start gap-3\">\n {icons[variant]}\n <div className=\"flex-1\">\n {title && <h4 className=\"font-medium\">{title}</h4>}\n <div className=\"text-sm\">{children}</div>\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n onClick={onDismiss}\n className=\"hover:opacity-70\"\n >\n <XCircle className=\"h-5 w-5\" />\n </button>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PublisherProfilePage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/PublisherProfilePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAuBhC;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,EAqZlC,CAAC"}
1
+ {"version":3,"file":"PublisherProfilePage.d.ts","sourceRoot":"","sources":["../../../src/devportal/pages/PublisherProfilePage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAuBhC;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,EAAE,EAqalC,CAAC"}
@@ -55,7 +55,7 @@ var x = () => {
55
55
  })
56
56
  }) : /* @__PURE__ */ v(s, {
57
57
  authOnly: !0,
58
- children: /* @__PURE__ */ y(i, {
58
+ children: /* @__PURE__ */ v(i, {
59
59
  title: S("devportal.publisherProfileTitle", "Publisher Profile"),
60
60
  description: S("devportal.manageMarketplaceAppearance", "Manage how you appear to users in the marketplace"),
61
61
  purpose: S("devportal.publisherProfilePurpose", "This is your public face in the marketplace — the name, logo, bio, and links users see before installing your apps. A complete, trustworthy profile makes shoppers more likely to install and is required before some apps can be published."),
@@ -93,173 +93,176 @@ var x = () => {
93
93
  className: "animate-spin"
94
94
  }) : v(W === "saved" ? p : W === "error" ? f : g, { size: 16 }), A ? S("devportal.savingButton", "Saving...") : W === "saved" ? S("devportal.savedButton", "Saved!") : W === "error" ? S("devportal.errorButton", "Error") : S("devportal.saveChangesButton", "Save Changes")]
95
95
  }),
96
- children: [/* @__PURE__ */ y("div", {
97
- className: "flex gap-3 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 text-sm text-status-info-text",
98
- children: [/* @__PURE__ */ v(m, {
99
- size: 16,
100
- className: "flex-shrink-0 mt-0.5"
101
- }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
102
- className: "font-medium",
103
- children: S("devportal.publisherProfilesWorkTitle", "How publisher profiles work")
104
- }), /* @__PURE__ */ v("p", {
105
- className: "mt-1 text-status-info-text",
106
- children: S("devportal.publisherProfilesWorkDesc", "When you publish your first app, a publisher profile is automatically created in the marketplace using your developer details. Keep this information up to date so users can trust and find your apps. Changes here are reflected when your next app is published.")
107
- })] })]
108
- }), /* @__PURE__ */ y("div", {
109
- className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
96
+ children: /* @__PURE__ */ y("div", {
97
+ className: "flex flex-col gap-6",
110
98
  children: [/* @__PURE__ */ y("div", {
111
- className: "lg:col-span-2 space-y-6",
112
- children: [/* @__PURE__ */ v(a, {
113
- title: S("devportal.publisherIdentityTitle", "Publisher Identity"),
114
- description: S("devportal.publisherIdentityDesc", "Displayed on your marketplace listings"),
115
- children: /* @__PURE__ */ y("div", {
116
- className: "space-y-4",
117
- children: [
118
- /* @__PURE__ */ v(o, {
119
- label: S("devportal.displayNameLabel", "Display Name / Company"),
120
- value: M,
121
- onChange: (e) => N(e.target.value),
122
- placeholder: S("devportal.displayNamePlaceholder", "Your name or company (shown on all your apps)")
123
- }),
124
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
125
- className: "text-sm font-medium text-text-primary",
126
- children: S("devportal.bioLabel", "Bio")
127
- }), /* @__PURE__ */ v("textarea", {
128
- value: I,
129
- onChange: (e) => L(e.target.value),
130
- placeholder: S("devportal.bioPlaceholder", "A short description of you or your company shown on the marketplace..."),
131
- rows: 3,
132
- className: "mt-1 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm ring-offset-background placeholder:text-text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] resize-none"
133
- })] }),
134
- /* @__PURE__ */ v(o, {
135
- label: S("devportal.websiteLabel", "Website"),
136
- value: P,
137
- onChange: (e) => F(e.target.value),
138
- placeholder: S("devportal.websitePlaceholder", "https://your-website.com")
139
- })
140
- ]
141
- })
142
- }), /* @__PURE__ */ v(a, {
143
- title: S("devportal.socialLinksTitle", "Social Links"),
144
- description: S("devportal.socialLinksDesc", "Build trust with your developer community"),
145
- children: /* @__PURE__ */ y("div", {
146
- className: "space-y-4",
147
- children: [
148
- /* @__PURE__ */ v(o, {
149
- label: S("devportal.githubUsernameLabel", "GitHub Username"),
150
- value: R,
151
- onChange: (e) => z(e.target.value),
152
- placeholder: S("devportal.githubUsernamePlaceholder", "your-github-username")
153
- }),
154
- /* @__PURE__ */ v(o, {
155
- label: S("devportal.twitterUsernameLabel", "Twitter / X Username"),
156
- value: B,
157
- onChange: (e) => V(e.target.value),
158
- placeholder: S("devportal.twitterUsernamePlaceholder", "your_twitter")
159
- }),
160
- /* @__PURE__ */ v(o, {
161
- label: S("devportal.linkedinUrlLabel", "LinkedIn URL"),
162
- value: H,
163
- onChange: (e) => U(e.target.value),
164
- placeholder: S("devportal.linkedinUrlPlaceholder", "https://linkedin.com/in/you")
165
- })
166
- ]
167
- })
168
- })]
99
+ className: "flex gap-3 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 text-sm text-status-info-text",
100
+ children: [/* @__PURE__ */ v(m, {
101
+ size: 16,
102
+ className: "flex-shrink-0 mt-0.5"
103
+ }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
104
+ className: "font-medium",
105
+ children: S("devportal.publisherProfilesWorkTitle", "How publisher profiles work")
106
+ }), /* @__PURE__ */ v("p", {
107
+ className: "mt-1 text-status-info-text",
108
+ children: S("devportal.publisherProfilesWorkDesc", "When you publish your first app, a publisher profile is automatically created in the marketplace using your developer details. Keep this information up to date so users can trust and find your apps. Changes here are reflected when your next app is published.")
109
+ })] })]
169
110
  }), /* @__PURE__ */ y("div", {
170
- className: "space-y-6",
171
- children: [
172
- /* @__PURE__ */ v(a, {
173
- title: S("devportal.publisherStatusTitle", "Publisher Status"),
111
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
112
+ children: [/* @__PURE__ */ y("div", {
113
+ className: "lg:col-span-2 space-y-6",
114
+ children: [/* @__PURE__ */ v(a, {
115
+ title: S("devportal.publisherIdentityTitle", "Publisher Identity"),
116
+ description: S("devportal.publisherIdentityDesc", "Displayed on your marketplace listings"),
174
117
  children: /* @__PURE__ */ y("div", {
175
- className: "flex items-center gap-3",
176
- children: [/* @__PURE__ */ v(_, { className: "h-8 w-8 text-primary" }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
177
- className: "font-medium",
178
- children: j?.isVerified ? S("devportal.verifiedPublisher", "Verified Publisher") : S("devportal.publisher", "Publisher")
179
- }), /* @__PURE__ */ v("p", {
180
- className: "text-xs text-text-secondary",
181
- children: j?.isVerified ? S("devportal.publisherIdentityVerified", "Your publisher identity is verified") : S("devportal.publishFirstAppMessage", "Publish your first app to appear in the marketplace")
182
- })] })]
183
- })
184
- }),
185
- /* @__PURE__ */ v(a, {
186
- title: S("devportal.profileCompletenessTitle", "Profile Completeness"),
187
- children: /* @__PURE__ */ v("div", {
188
- className: "space-y-2",
118
+ className: "space-y-4",
189
119
  children: [
190
- {
191
- label: S("devportal.completenessDisplayName", "Display name"),
192
- ok: !!M
193
- },
194
- {
195
- label: S("devportal.completenessBio", "Bio"),
196
- ok: !!I
197
- },
198
- {
199
- label: S("devportal.completenessWebsite", "Website"),
200
- ok: !!P
201
- },
202
- {
203
- label: S("devportal.completenessGithub", "GitHub"),
204
- ok: !!R
205
- },
206
- {
207
- label: S("devportal.completenessSocialLinks", "Social links"),
208
- ok: !!B || !!H
209
- }
210
- ].map(({ label: e, ok: t }) => /* @__PURE__ */ y("div", {
211
- className: "flex items-center gap-2 text-sm",
212
- children: [t ? /* @__PURE__ */ v(p, {
213
- size: 14,
214
- className: "text-status-success-text"
215
- }) : /* @__PURE__ */ v("div", { className: "h-3.5 w-3.5 rounded-full border-2 border-muted-foreground" }), /* @__PURE__ */ v("span", {
216
- className: t ? "text-text-primary" : "text-text-secondary",
217
- children: e
218
- })]
219
- }, e))
120
+ /* @__PURE__ */ v(o, {
121
+ label: S("devportal.displayNameLabel", "Display Name / Company"),
122
+ value: M,
123
+ onChange: (e) => N(e.target.value),
124
+ placeholder: S("devportal.displayNamePlaceholder", "Your name or company (shown on all your apps)")
125
+ }),
126
+ /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("label", {
127
+ className: "text-sm font-medium text-text-primary",
128
+ children: S("devportal.bioLabel", "Bio")
129
+ }), /* @__PURE__ */ v("textarea", {
130
+ value: I,
131
+ onChange: (e) => L(e.target.value),
132
+ placeholder: S("devportal.bioPlaceholder", "A short description of you or your company shown on the marketplace..."),
133
+ rows: 3,
134
+ className: "mt-1 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm ring-offset-background placeholder:text-text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] resize-none"
135
+ })] }),
136
+ /* @__PURE__ */ v(o, {
137
+ label: S("devportal.websiteLabel", "Website"),
138
+ value: P,
139
+ onChange: (e) => F(e.target.value),
140
+ placeholder: S("devportal.websitePlaceholder", "https://your-website.com")
141
+ })
142
+ ]
220
143
  })
221
- }),
222
- /* @__PURE__ */ v(a, {
223
- title: S("devportal.marketplaceStatsTitle", "Marketplace Stats"),
144
+ }), /* @__PURE__ */ v(a, {
145
+ title: S("devportal.socialLinksTitle", "Social Links"),
146
+ description: S("devportal.socialLinksDesc", "Build trust with your developer community"),
224
147
  children: /* @__PURE__ */ y("div", {
225
- className: "space-y-3 text-sm",
148
+ className: "space-y-4",
226
149
  children: [
227
- /* @__PURE__ */ y("div", {
228
- className: "flex justify-between",
229
- children: [/* @__PURE__ */ v("span", {
230
- className: "text-text-secondary",
231
- children: S("devportal.publishedAppsLabel", "Published apps")
232
- }), /* @__PURE__ */ v("span", {
233
- className: "font-semibold",
234
- children: j?.applicationCount ?? 0
235
- })]
150
+ /* @__PURE__ */ v(o, {
151
+ label: S("devportal.githubUsernameLabel", "GitHub Username"),
152
+ value: R,
153
+ onChange: (e) => z(e.target.value),
154
+ placeholder: S("devportal.githubUsernamePlaceholder", "your-github-username")
236
155
  }),
237
- /* @__PURE__ */ y("div", {
238
- className: "flex justify-between",
239
- children: [/* @__PURE__ */ v("span", {
240
- className: "text-text-secondary",
241
- children: S("devportal.totalInstallsLabel", "Total installs")
242
- }), /* @__PURE__ */ v("span", {
243
- className: "font-semibold",
244
- children: j?.totalInstalls ?? 0
245
- })]
156
+ /* @__PURE__ */ v(o, {
157
+ label: S("devportal.twitterUsernameLabel", "Twitter / X Username"),
158
+ value: B,
159
+ onChange: (e) => V(e.target.value),
160
+ placeholder: S("devportal.twitterUsernamePlaceholder", "your_twitter")
246
161
  }),
247
- /* @__PURE__ */ y("div", {
248
- className: "flex justify-between",
249
- children: [/* @__PURE__ */ v("span", {
250
- className: "text-text-secondary",
251
- children: S("devportal.avgRatingLabel", "Avg rating")
252
- }), /* @__PURE__ */ v("span", {
253
- className: "font-semibold",
254
- children: j?.averageRating ? j.averageRating.toFixed(1) : "—"
255
- })]
162
+ /* @__PURE__ */ v(o, {
163
+ label: S("devportal.linkedinUrlLabel", "LinkedIn URL"),
164
+ value: H,
165
+ onChange: (e) => U(e.target.value),
166
+ placeholder: S("devportal.linkedinUrlPlaceholder", "https://linkedin.com/in/you")
256
167
  })
257
168
  ]
258
169
  })
259
- })
260
- ]
170
+ })]
171
+ }), /* @__PURE__ */ y("div", {
172
+ className: "space-y-6",
173
+ children: [
174
+ /* @__PURE__ */ v(a, {
175
+ title: S("devportal.publisherStatusTitle", "Publisher Status"),
176
+ children: /* @__PURE__ */ y("div", {
177
+ className: "flex items-center gap-3",
178
+ children: [/* @__PURE__ */ v(_, { className: "h-8 w-8 text-primary" }), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
179
+ className: "font-medium",
180
+ children: j?.isVerified ? S("devportal.verifiedPublisher", "Verified Publisher") : S("devportal.publisher", "Publisher")
181
+ }), /* @__PURE__ */ v("p", {
182
+ className: "text-xs text-text-secondary",
183
+ children: j?.isVerified ? S("devportal.publisherIdentityVerified", "Your publisher identity is verified") : S("devportal.publishFirstAppMessage", "Publish your first app to appear in the marketplace")
184
+ })] })]
185
+ })
186
+ }),
187
+ /* @__PURE__ */ v(a, {
188
+ title: S("devportal.profileCompletenessTitle", "Profile Completeness"),
189
+ children: /* @__PURE__ */ v("div", {
190
+ className: "space-y-2",
191
+ children: [
192
+ {
193
+ label: S("devportal.completenessDisplayName", "Display name"),
194
+ ok: !!M
195
+ },
196
+ {
197
+ label: S("devportal.completenessBio", "Bio"),
198
+ ok: !!I
199
+ },
200
+ {
201
+ label: S("devportal.completenessWebsite", "Website"),
202
+ ok: !!P
203
+ },
204
+ {
205
+ label: S("devportal.completenessGithub", "GitHub"),
206
+ ok: !!R
207
+ },
208
+ {
209
+ label: S("devportal.completenessSocialLinks", "Social links"),
210
+ ok: !!B || !!H
211
+ }
212
+ ].map(({ label: e, ok: t }) => /* @__PURE__ */ y("div", {
213
+ className: "flex items-center gap-2 text-sm",
214
+ children: [t ? /* @__PURE__ */ v(p, {
215
+ size: 14,
216
+ className: "text-status-success-text"
217
+ }) : /* @__PURE__ */ v("div", { className: "h-3.5 w-3.5 rounded-full border-2 border-muted-foreground" }), /* @__PURE__ */ v("span", {
218
+ className: t ? "text-text-primary" : "text-text-secondary",
219
+ children: e
220
+ })]
221
+ }, e))
222
+ })
223
+ }),
224
+ /* @__PURE__ */ v(a, {
225
+ title: S("devportal.marketplaceStatsTitle", "Marketplace Stats"),
226
+ children: /* @__PURE__ */ y("div", {
227
+ className: "space-y-3 text-sm",
228
+ children: [
229
+ /* @__PURE__ */ y("div", {
230
+ className: "flex justify-between",
231
+ children: [/* @__PURE__ */ v("span", {
232
+ className: "text-text-secondary",
233
+ children: S("devportal.publishedAppsLabel", "Published apps")
234
+ }), /* @__PURE__ */ v("span", {
235
+ className: "font-semibold",
236
+ children: j?.applicationCount ?? 0
237
+ })]
238
+ }),
239
+ /* @__PURE__ */ y("div", {
240
+ className: "flex justify-between",
241
+ children: [/* @__PURE__ */ v("span", {
242
+ className: "text-text-secondary",
243
+ children: S("devportal.totalInstallsLabel", "Total installs")
244
+ }), /* @__PURE__ */ v("span", {
245
+ className: "font-semibold",
246
+ children: j?.totalInstalls ?? 0
247
+ })]
248
+ }),
249
+ /* @__PURE__ */ y("div", {
250
+ className: "flex justify-between",
251
+ children: [/* @__PURE__ */ v("span", {
252
+ className: "text-text-secondary",
253
+ children: S("devportal.avgRatingLabel", "Avg rating")
254
+ }), /* @__PURE__ */ v("span", {
255
+ className: "font-semibold",
256
+ children: j?.averageRating ? j.averageRating.toFixed(1) : "—"
257
+ })]
258
+ })
259
+ ]
260
+ })
261
+ })
262
+ ]
263
+ })]
261
264
  })]
262
- })]
265
+ })
263
266
  })
264
267
  });
265
268
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PublisherProfilePage.js","names":[],"sources":["../../../src/devportal/pages/PublisherProfilePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n Store,\n Save,\n CheckCircle2,\n AlertCircle,\n Loader2,\n Info,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { InputField } from \"../components/FormField\";\nimport { cn } from \"../utils/cn\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport {\n useGetMyDeveloperProfileQuery,\n useUpdateDeveloperProfileMutation,\n} from \"../hooks/useGraphQL\";\n\n/**\n * Publisher Profile Page\n *\n * Lets developers enrich their store publisher presence.\n * The publisher profile in global-store-svc is auto-created when an app is\n * first published. This page surfaces the underlying developer profile fields\n * that feed into that publisher identity so developers can keep them current.\n */\nexport const PublisherProfilePage: FC = () => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const { currentUser } = useDevportal();\n const { allowed: canSave } = useDevportalPermission(\n DEVPORTAL_PERMISSIONS.PROFILE_UPDATE,\n );\n const { data, loading, error, refetch } = useGetMyDeveloperProfileQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const [updateProfile, { loading: saving }] =\n useUpdateDeveloperProfileMutation();\n\n const profile = data?.myDeveloperProfile;\n\n // Form state — publisher-relevant fields\n const [companyName, setCompanyName] = useState(\"\");\n const [website, setWebsite] = useState(\"\");\n const [bio, setBio] = useState(\"\");\n const [githubUsername, setGithubUsername] = useState(\"\");\n const [twitterUsername, setTwitterUsername] = useState(\"\");\n const [linkedinUrl, setLinkedinUrl] = useState(\"\");\n\n const [saveStatus, setSaveStatus] = useState<\n \"idle\" | \"saving\" | \"saved\" | \"error\"\n >(\"idle\");\n\n useEffect(() => {\n if (profile) {\n setCompanyName(profile.companyName ?? \"\");\n setWebsite(profile.website ?? \"\");\n setBio(profile.bio ?? \"\");\n setGithubUsername(profile.githubUsername ?? \"\");\n setTwitterUsername(profile.twitterUsername ?? \"\");\n setLinkedinUrl(profile.linkedinUrl ?? \"\");\n } else if (!loading && currentUser) {\n // No profile yet — pre-fill display name from account\n const fullName = [currentUser.firstName, currentUser.lastName]\n .filter(Boolean)\n .join(\" \");\n if (fullName) setCompanyName(fullName);\n }\n }, [profile, loading, currentUser]);\n\n const handleSave = async () => {\n const userId = profile?.userId ?? currentUser?.id;\n if (!userId) return;\n setSaveStatus(\"saving\");\n try {\n const result = await updateProfile({\n variables: {\n userId,\n input: {\n companyName: companyName || null,\n website: website || null,\n bio: bio || null,\n githubUsername: githubUsername || null,\n twitterUsername: twitterUsername || null,\n linkedinUrl: linkedinUrl || null,\n // preserve existing notification prefs\n emailNotifications: profile?.emailNotifications,\n marketingEmails: profile?.marketingEmails,\n },\n },\n });\n if (result.error) {\n throw result.error;\n }\n setSaveStatus(\"saved\");\n await refetch();\n setTimeout(() => setSaveStatus(\"idle\"), 3000);\n } catch {\n setSaveStatus(\"error\");\n setTimeout(() => setSaveStatus(\"idle\"), 5000);\n }\n };\n\n if (loading && !profile) {\n return (\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.loadingPublisherProfile\",\n \"Loading your publisher profile...\",\n )}\n >\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (error && !profile) {\n return (\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.manageStorePublisherPresence\",\n \"Manage your store publisher presence\",\n )}\n >\n <div className=\"flex flex-col items-center justify-center gap-4 py-20\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <p className=\"text-text-secondary\">\n {tr(\"devportal.failedToLoadProfile\", \"Failed to load profile\")}\n </p>\n <button\n onClick={() => refetch()}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.retryButton\", \"Retry\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.manageMarketplaceAppearance\",\n \"Manage how you appear to users in the marketplace\",\n )}\n purpose={tr(\n \"devportal.publisherProfilePurpose\",\n \"This is your public face in the marketplace — the name, logo, bio, and links users see before installing your apps. A complete, trustworthy profile makes shoppers more likely to install and is required before some apps can be published.\",\n )}\n actions={\n <button\n onClick={handleSave}\n disabled={saving || !canSave}\n aria-disabled={!canSave}\n className={cn(\n \"inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors\",\n saveStatus === \"saved\"\n ? \"bg-status-success-bg text-white\"\n : saveStatus === \"error\"\n ? \"bg-status-error-bg text-status-error-text\"\n : \"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90\",\n saving && \"opacity-50 cursor-not-allowed\",\n )}\n >\n {saving ? (\n <Loader2 size={16} className=\"animate-spin\" />\n ) : saveStatus === \"saved\" ? (\n <CheckCircle2 size={16} />\n ) : saveStatus === \"error\" ? (\n <AlertCircle size={16} />\n ) : (\n <Save size={16} />\n )}\n {saving\n ? tr(\"devportal.savingButton\", \"Saving...\")\n : saveStatus === \"saved\"\n ? tr(\"devportal.savedButton\", \"Saved!\")\n : saveStatus === \"error\"\n ? tr(\"devportal.errorButton\", \"Error\")\n : tr(\"devportal.saveChangesButton\", \"Save Changes\")}\n </button>\n }\n >\n {/* Info banner */}\n <div className=\"flex gap-3 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 text-sm text-status-info-text\">\n <Info size={16} className=\"flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tr(\n \"devportal.publisherProfilesWorkTitle\",\n \"How publisher profiles work\",\n )}\n </p>\n <p className=\"mt-1 text-status-info-text\">\n {tr(\n \"devportal.publisherProfilesWorkDesc\",\n \"When you publish your first app, a publisher profile is automatically created in the marketplace using your developer details. Keep this information up to date so users can trust and find your apps. Changes here are reflected when your next app is published.\",\n )}\n </p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Publisher identity */}\n <PageSection\n title={tr(\n \"devportal.publisherIdentityTitle\",\n \"Publisher Identity\",\n )}\n description={tr(\n \"devportal.publisherIdentityDesc\",\n \"Displayed on your marketplace listings\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\n \"devportal.displayNameLabel\",\n \"Display Name / Company\",\n )}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n placeholder={tr(\n \"devportal.displayNamePlaceholder\",\n \"Your name or company (shown on all your apps)\",\n )}\n />\n <div>\n <label className=\"text-sm font-medium text-text-primary\">\n {tr(\"devportal.bioLabel\", \"Bio\")}\n </label>\n <textarea\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n placeholder={tr(\n \"devportal.bioPlaceholder\",\n \"A short description of you or your company shown on the marketplace...\",\n )}\n rows={3}\n className=\"mt-1 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm ring-offset-background placeholder:text-text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n <InputField\n label={tr(\"devportal.websiteLabel\", \"Website\")}\n value={website}\n onChange={(e) => setWebsite(e.target.value)}\n placeholder={tr(\n \"devportal.websitePlaceholder\",\n \"https://your-website.com\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Social links */}\n <PageSection\n title={tr(\"devportal.socialLinksTitle\", \"Social Links\")}\n description={tr(\n \"devportal.socialLinksDesc\",\n \"Build trust with your developer community\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\"devportal.githubUsernameLabel\", \"GitHub Username\")}\n value={githubUsername}\n onChange={(e) => setGithubUsername(e.target.value)}\n placeholder={tr(\n \"devportal.githubUsernamePlaceholder\",\n \"your-github-username\",\n )}\n />\n <InputField\n label={tr(\n \"devportal.twitterUsernameLabel\",\n \"Twitter / X Username\",\n )}\n value={twitterUsername}\n onChange={(e) => setTwitterUsername(e.target.value)}\n placeholder={tr(\n \"devportal.twitterUsernamePlaceholder\",\n \"your_twitter\",\n )}\n />\n <InputField\n label={tr(\"devportal.linkedinUrlLabel\", \"LinkedIn URL\")}\n value={linkedinUrl}\n onChange={(e) => setLinkedinUrl(e.target.value)}\n placeholder={tr(\n \"devportal.linkedinUrlPlaceholder\",\n \"https://linkedin.com/in/you\",\n )}\n />\n </div>\n </PageSection>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Publisher status */}\n <PageSection\n title={tr(\"devportal.publisherStatusTitle\", \"Publisher Status\")}\n >\n <div className=\"flex items-center gap-3\">\n <Store className=\"h-8 w-8 text-primary\" />\n <div>\n <p className=\"font-medium\">\n {profile?.isVerified\n ? tr(\"devportal.verifiedPublisher\", \"Verified Publisher\")\n : tr(\"devportal.publisher\", \"Publisher\")}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {profile?.isVerified\n ? tr(\n \"devportal.publisherIdentityVerified\",\n \"Your publisher identity is verified\",\n )\n : tr(\n \"devportal.publishFirstAppMessage\",\n \"Publish your first app to appear in the marketplace\",\n )}\n </p>\n </div>\n </div>\n </PageSection>\n\n {/* Profile completeness */}\n <PageSection\n title={tr(\n \"devportal.profileCompletenessTitle\",\n \"Profile Completeness\",\n )}\n >\n <div className=\"space-y-2\">\n {[\n {\n label: tr(\n \"devportal.completenessDisplayName\",\n \"Display name\",\n ),\n ok: !!companyName,\n },\n { label: tr(\"devportal.completenessBio\", \"Bio\"), ok: !!bio },\n {\n label: tr(\"devportal.completenessWebsite\", \"Website\"),\n ok: !!website,\n },\n {\n label: tr(\"devportal.completenessGithub\", \"GitHub\"),\n ok: !!githubUsername,\n },\n {\n label: tr(\n \"devportal.completenessSocialLinks\",\n \"Social links\",\n ),\n ok: !!twitterUsername || !!linkedinUrl,\n },\n ].map(({ label, ok }) => (\n <div key={label} className=\"flex items-center gap-2 text-sm\">\n {ok ? (\n <CheckCircle2\n size={14}\n className=\"text-status-success-text\"\n />\n ) : (\n <div className=\"h-3.5 w-3.5 rounded-full border-2 border-muted-foreground\" />\n )}\n <span\n className={\n ok ? \"text-text-primary\" : \"text-text-secondary\"\n }\n >\n {label}\n </span>\n </div>\n ))}\n </div>\n </PageSection>\n\n {/* Stats */}\n <PageSection\n title={tr(\"devportal.marketplaceStatsTitle\", \"Marketplace Stats\")}\n >\n <div className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.publishedAppsLabel\", \"Published apps\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.applicationCount ?? 0}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.totalInstallsLabel\", \"Total installs\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.totalInstalls ?? 0}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.avgRatingLabel\", \"Avg rating\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.averageRating\n ? profile.averageRating.toFixed(1)\n : \"—\"}\n </span>\n </div>\n </div>\n </PageSection>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"PublisherProfilePage.js","names":[],"sources":["../../../src/devportal/pages/PublisherProfilePage.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useState, useEffect } from \"react\";\nimport { useI18n } from \"@burdenoff/fe-libs/shared/providers/shell/I18nProvider\";\nimport {\n Store,\n Save,\n CheckCircle2,\n AlertCircle,\n Loader2,\n Info,\n} from \"lucide-react\";\nimport { PageLayout, PageSection } from \"../components/PageLayout\";\nimport { InputField } from \"../components/FormField\";\nimport { cn } from \"../utils/cn\";\nimport { PermissionGuard } from \"../components\";\nimport { DEVPORTAL_PERMISSIONS } from \"../constants/permissions\";\nimport { useDevportalPermission } from \"../hooks/usePermission\";\nimport { useDevportal } from \"../providers/DevportalProvider\";\nimport {\n useGetMyDeveloperProfileQuery,\n useUpdateDeveloperProfileMutation,\n} from \"../hooks/useGraphQL\";\n\n/**\n * Publisher Profile Page\n *\n * Lets developers enrich their store publisher presence.\n * The publisher profile in global-store-svc is auto-created when an app is\n * first published. This page surfaces the underlying developer profile fields\n * that feed into that publisher identity so developers can keep them current.\n */\nexport const PublisherProfilePage: FC = () => {\n const { t } = useI18n();\n const tr = (key: string, fallback: string): string => {\n const value = t(key);\n return value === key ? fallback : value;\n };\n const { currentUser } = useDevportal();\n const { allowed: canSave } = useDevportalPermission(\n DEVPORTAL_PERMISSIONS.PROFILE_UPDATE,\n );\n const { data, loading, error, refetch } = useGetMyDeveloperProfileQuery({\n fetchPolicy: \"cache-and-network\",\n });\n\n const [updateProfile, { loading: saving }] =\n useUpdateDeveloperProfileMutation();\n\n const profile = data?.myDeveloperProfile;\n\n // Form state — publisher-relevant fields\n const [companyName, setCompanyName] = useState(\"\");\n const [website, setWebsite] = useState(\"\");\n const [bio, setBio] = useState(\"\");\n const [githubUsername, setGithubUsername] = useState(\"\");\n const [twitterUsername, setTwitterUsername] = useState(\"\");\n const [linkedinUrl, setLinkedinUrl] = useState(\"\");\n\n const [saveStatus, setSaveStatus] = useState<\n \"idle\" | \"saving\" | \"saved\" | \"error\"\n >(\"idle\");\n\n useEffect(() => {\n if (profile) {\n setCompanyName(profile.companyName ?? \"\");\n setWebsite(profile.website ?? \"\");\n setBio(profile.bio ?? \"\");\n setGithubUsername(profile.githubUsername ?? \"\");\n setTwitterUsername(profile.twitterUsername ?? \"\");\n setLinkedinUrl(profile.linkedinUrl ?? \"\");\n } else if (!loading && currentUser) {\n // No profile yet — pre-fill display name from account\n const fullName = [currentUser.firstName, currentUser.lastName]\n .filter(Boolean)\n .join(\" \");\n if (fullName) setCompanyName(fullName);\n }\n }, [profile, loading, currentUser]);\n\n const handleSave = async () => {\n const userId = profile?.userId ?? currentUser?.id;\n if (!userId) return;\n setSaveStatus(\"saving\");\n try {\n const result = await updateProfile({\n variables: {\n userId,\n input: {\n companyName: companyName || null,\n website: website || null,\n bio: bio || null,\n githubUsername: githubUsername || null,\n twitterUsername: twitterUsername || null,\n linkedinUrl: linkedinUrl || null,\n // preserve existing notification prefs\n emailNotifications: profile?.emailNotifications,\n marketingEmails: profile?.marketingEmails,\n },\n },\n });\n if (result.error) {\n throw result.error;\n }\n setSaveStatus(\"saved\");\n await refetch();\n setTimeout(() => setSaveStatus(\"idle\"), 3000);\n } catch {\n setSaveStatus(\"error\");\n setTimeout(() => setSaveStatus(\"idle\"), 5000);\n }\n };\n\n if (loading && !profile) {\n return (\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.loadingPublisherProfile\",\n \"Loading your publisher profile...\",\n )}\n >\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 className=\"h-8 w-8 animate-spin text-text-secondary\" />\n </div>\n </PageLayout>\n );\n }\n\n if (error && !profile) {\n return (\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.manageStorePublisherPresence\",\n \"Manage your store publisher presence\",\n )}\n >\n <div className=\"flex flex-col items-center justify-center gap-4 py-20\">\n <AlertCircle className=\"h-12 w-12 text-status-error-text\" />\n <p className=\"text-text-secondary\">\n {tr(\"devportal.failedToLoadProfile\", \"Failed to load profile\")}\n </p>\n <button\n onClick={() => refetch()}\n className=\"rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90\"\n >\n {tr(\"devportal.retryButton\", \"Retry\")}\n </button>\n </div>\n </PageLayout>\n );\n }\n\n return (\n <PermissionGuard authOnly>\n <PageLayout\n title={tr(\"devportal.publisherProfileTitle\", \"Publisher Profile\")}\n description={tr(\n \"devportal.manageMarketplaceAppearance\",\n \"Manage how you appear to users in the marketplace\",\n )}\n purpose={tr(\n \"devportal.publisherProfilePurpose\",\n \"This is your public face in the marketplace — the name, logo, bio, and links users see before installing your apps. A complete, trustworthy profile makes shoppers more likely to install and is required before some apps can be published.\",\n )}\n actions={\n <button\n onClick={handleSave}\n disabled={saving || !canSave}\n aria-disabled={!canSave}\n className={cn(\n \"inline-flex items-center gap-2 rounded-md px-4 py-2 text-sm font-medium transition-colors\",\n saveStatus === \"saved\"\n ? \"bg-status-success-bg text-white\"\n : saveStatus === \"error\"\n ? \"bg-status-error-bg text-status-error-text\"\n : \"bg-action-primary-bg text-action-primary-text hover:bg-action-primary-bg/90\",\n saving && \"opacity-50 cursor-not-allowed\",\n )}\n >\n {saving ? (\n <Loader2 size={16} className=\"animate-spin\" />\n ) : saveStatus === \"saved\" ? (\n <CheckCircle2 size={16} />\n ) : saveStatus === \"error\" ? (\n <AlertCircle size={16} />\n ) : (\n <Save size={16} />\n )}\n {saving\n ? tr(\"devportal.savingButton\", \"Saving...\")\n : saveStatus === \"saved\"\n ? tr(\"devportal.savedButton\", \"Saved!\")\n : saveStatus === \"error\"\n ? tr(\"devportal.errorButton\", \"Error\")\n : tr(\"devportal.saveChangesButton\", \"Save Changes\")}\n </button>\n }\n >\n <div className=\"flex flex-col gap-6\">\n <div className=\"flex gap-3 rounded-lg border border-border-subtle bg-status-info-bg-subtle p-4 text-sm text-status-info-text\">\n <Info size={16} className=\"flex-shrink-0 mt-0.5\" />\n <div>\n <p className=\"font-medium\">\n {tr(\n \"devportal.publisherProfilesWorkTitle\",\n \"How publisher profiles work\",\n )}\n </p>\n <p className=\"mt-1 text-status-info-text\">\n {tr(\n \"devportal.publisherProfilesWorkDesc\",\n \"When you publish your first app, a publisher profile is automatically created in the marketplace using your developer details. Keep this information up to date so users can trust and find your apps. Changes here are reflected when your next app is published.\",\n )}\n </p>\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Main form */}\n <div className=\"lg:col-span-2 space-y-6\">\n {/* Publisher identity */}\n <PageSection\n title={tr(\n \"devportal.publisherIdentityTitle\",\n \"Publisher Identity\",\n )}\n description={tr(\n \"devportal.publisherIdentityDesc\",\n \"Displayed on your marketplace listings\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\n \"devportal.displayNameLabel\",\n \"Display Name / Company\",\n )}\n value={companyName}\n onChange={(e) => setCompanyName(e.target.value)}\n placeholder={tr(\n \"devportal.displayNamePlaceholder\",\n \"Your name or company (shown on all your apps)\",\n )}\n />\n <div>\n <label className=\"text-sm font-medium text-text-primary\">\n {tr(\"devportal.bioLabel\", \"Bio\")}\n </label>\n <textarea\n value={bio}\n onChange={(e) => setBio(e.target.value)}\n placeholder={tr(\n \"devportal.bioPlaceholder\",\n \"A short description of you or your company shown on the marketplace...\",\n )}\n rows={3}\n className=\"mt-1 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm ring-offset-background placeholder:text-text-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--color-focus-ring)] resize-none\"\n />\n </div>\n <InputField\n label={tr(\"devportal.websiteLabel\", \"Website\")}\n value={website}\n onChange={(e) => setWebsite(e.target.value)}\n placeholder={tr(\n \"devportal.websitePlaceholder\",\n \"https://your-website.com\",\n )}\n />\n </div>\n </PageSection>\n\n {/* Social links */}\n <PageSection\n title={tr(\"devportal.socialLinksTitle\", \"Social Links\")}\n description={tr(\n \"devportal.socialLinksDesc\",\n \"Build trust with your developer community\",\n )}\n >\n <div className=\"space-y-4\">\n <InputField\n label={tr(\n \"devportal.githubUsernameLabel\",\n \"GitHub Username\",\n )}\n value={githubUsername}\n onChange={(e) => setGithubUsername(e.target.value)}\n placeholder={tr(\n \"devportal.githubUsernamePlaceholder\",\n \"your-github-username\",\n )}\n />\n <InputField\n label={tr(\n \"devportal.twitterUsernameLabel\",\n \"Twitter / X Username\",\n )}\n value={twitterUsername}\n onChange={(e) => setTwitterUsername(e.target.value)}\n placeholder={tr(\n \"devportal.twitterUsernamePlaceholder\",\n \"your_twitter\",\n )}\n />\n <InputField\n label={tr(\"devportal.linkedinUrlLabel\", \"LinkedIn URL\")}\n value={linkedinUrl}\n onChange={(e) => setLinkedinUrl(e.target.value)}\n placeholder={tr(\n \"devportal.linkedinUrlPlaceholder\",\n \"https://linkedin.com/in/you\",\n )}\n />\n </div>\n </PageSection>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* Publisher status */}\n <PageSection\n title={tr(\"devportal.publisherStatusTitle\", \"Publisher Status\")}\n >\n <div className=\"flex items-center gap-3\">\n <Store className=\"h-8 w-8 text-primary\" />\n <div>\n <p className=\"font-medium\">\n {profile?.isVerified\n ? tr(\n \"devportal.verifiedPublisher\",\n \"Verified Publisher\",\n )\n : tr(\"devportal.publisher\", \"Publisher\")}\n </p>\n <p className=\"text-xs text-text-secondary\">\n {profile?.isVerified\n ? tr(\n \"devportal.publisherIdentityVerified\",\n \"Your publisher identity is verified\",\n )\n : tr(\n \"devportal.publishFirstAppMessage\",\n \"Publish your first app to appear in the marketplace\",\n )}\n </p>\n </div>\n </div>\n </PageSection>\n\n {/* Profile completeness */}\n <PageSection\n title={tr(\n \"devportal.profileCompletenessTitle\",\n \"Profile Completeness\",\n )}\n >\n <div className=\"space-y-2\">\n {[\n {\n label: tr(\n \"devportal.completenessDisplayName\",\n \"Display name\",\n ),\n ok: !!companyName,\n },\n {\n label: tr(\"devportal.completenessBio\", \"Bio\"),\n ok: !!bio,\n },\n {\n label: tr(\"devportal.completenessWebsite\", \"Website\"),\n ok: !!website,\n },\n {\n label: tr(\"devportal.completenessGithub\", \"GitHub\"),\n ok: !!githubUsername,\n },\n {\n label: tr(\n \"devportal.completenessSocialLinks\",\n \"Social links\",\n ),\n ok: !!twitterUsername || !!linkedinUrl,\n },\n ].map(({ label, ok }) => (\n <div\n key={label}\n className=\"flex items-center gap-2 text-sm\"\n >\n {ok ? (\n <CheckCircle2\n size={14}\n className=\"text-status-success-text\"\n />\n ) : (\n <div className=\"h-3.5 w-3.5 rounded-full border-2 border-muted-foreground\" />\n )}\n <span\n className={\n ok ? \"text-text-primary\" : \"text-text-secondary\"\n }\n >\n {label}\n </span>\n </div>\n ))}\n </div>\n </PageSection>\n\n {/* Stats */}\n <PageSection\n title={tr(\n \"devportal.marketplaceStatsTitle\",\n \"Marketplace Stats\",\n )}\n >\n <div className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.publishedAppsLabel\", \"Published apps\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.applicationCount ?? 0}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.totalInstallsLabel\", \"Total installs\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.totalInstalls ?? 0}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tr(\"devportal.avgRatingLabel\", \"Avg rating\")}\n </span>\n <span className=\"font-semibold\">\n {profile?.averageRating\n ? profile.averageRating.toFixed(1)\n : \"—\"}\n </span>\n </div>\n </div>\n </PageSection>\n </div>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-devportal",
3
- "version": "2026.921.1",
3
+ "version": "2026.1006.1",
4
4
  "description": "Burdenoff Developer Portal Microfrontend - Complete developer operations interface",
5
5
  "type": "module",
6
6
  "files": [