@connextar/house 0.17.0 → 0.19.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.
Files changed (123) hide show
  1. package/README.md +850 -0
  2. package/dist/admin/access.d.ts +134 -0
  3. package/dist/admin/access.d.ts.map +1 -0
  4. package/dist/admin/access.js +157 -0
  5. package/dist/admin/access.js.map +1 -0
  6. package/dist/admin/audit.d.ts +130 -0
  7. package/dist/admin/audit.d.ts.map +1 -0
  8. package/dist/admin/audit.js +132 -0
  9. package/dist/admin/audit.js.map +1 -0
  10. package/dist/admin/bootstrap.d.ts +80 -0
  11. package/dist/admin/bootstrap.d.ts.map +1 -0
  12. package/dist/admin/bootstrap.js +106 -0
  13. package/dist/admin/bootstrap.js.map +1 -0
  14. package/dist/admin/client-index.d.ts +7 -0
  15. package/dist/admin/client-index.d.ts.map +1 -0
  16. package/dist/admin/client-index.js +6 -0
  17. package/dist/admin/client-index.js.map +1 -0
  18. package/dist/admin/client.d.ts +72 -0
  19. package/dist/admin/client.d.ts.map +1 -0
  20. package/dist/admin/client.js +90 -0
  21. package/dist/admin/client.js.map +1 -0
  22. package/dist/admin/index.d.ts +13 -0
  23. package/dist/admin/index.d.ts.map +1 -0
  24. package/dist/admin/index.js +13 -0
  25. package/dist/admin/index.js.map +1 -0
  26. package/dist/admin/proof.d.ts +34 -0
  27. package/dist/admin/proof.d.ts.map +1 -0
  28. package/dist/admin/proof.js +30 -0
  29. package/dist/admin/proof.js.map +1 -0
  30. package/dist/admin/second-factor-index.d.ts +8 -0
  31. package/dist/admin/second-factor-index.d.ts.map +1 -0
  32. package/dist/admin/second-factor-index.js +8 -0
  33. package/dist/admin/second-factor-index.js.map +1 -0
  34. package/dist/admin/second-factor.d.ts +156 -0
  35. package/dist/admin/second-factor.d.ts.map +1 -0
  36. package/dist/admin/second-factor.js +271 -0
  37. package/dist/admin/second-factor.js.map +1 -0
  38. package/dist/admin/testing-index.d.ts +6 -0
  39. package/dist/admin/testing-index.d.ts.map +1 -0
  40. package/dist/admin/testing-index.js +6 -0
  41. package/dist/admin/testing-index.js.map +1 -0
  42. package/dist/admin/testing.d.ts +84 -0
  43. package/dist/admin/testing.d.ts.map +1 -0
  44. package/dist/admin/testing.js +223 -0
  45. package/dist/admin/testing.js.map +1 -0
  46. package/dist/admin/view-as.d.ts +209 -0
  47. package/dist/admin/view-as.d.ts.map +1 -0
  48. package/dist/admin/view-as.js +251 -0
  49. package/dist/admin/view-as.js.map +1 -0
  50. package/dist/guides/guide-article.d.ts +13 -2
  51. package/dist/guides/guide-article.d.ts.map +1 -1
  52. package/dist/guides/guide-article.js +5 -3
  53. package/dist/guides/guide-article.js.map +1 -1
  54. package/dist/guides/guide-figure-zoom.d.ts +73 -0
  55. package/dist/guides/guide-figure-zoom.d.ts.map +1 -0
  56. package/dist/guides/guide-figure-zoom.js +279 -0
  57. package/dist/guides/guide-figure-zoom.js.map +1 -0
  58. package/dist/guides/guide-figure.d.ts +21 -0
  59. package/dist/guides/guide-figure.d.ts.map +1 -0
  60. package/dist/guides/guide-figure.js +19 -0
  61. package/dist/guides/guide-figure.js.map +1 -0
  62. package/dist/guides/index.d.ts +2 -0
  63. package/dist/guides/index.d.ts.map +1 -1
  64. package/dist/guides/index.js +2 -0
  65. package/dist/guides/index.js.map +1 -1
  66. package/dist/guides/library.d.ts +19 -1
  67. package/dist/guides/library.d.ts.map +1 -1
  68. package/dist/guides/library.js +9 -0
  69. package/dist/guides/library.js.map +1 -1
  70. package/dist/health/health.d.ts +65 -0
  71. package/dist/health/health.d.ts.map +1 -0
  72. package/dist/health/health.js +93 -0
  73. package/dist/health/health.js.map +1 -0
  74. package/dist/health/index.d.ts +2 -0
  75. package/dist/health/index.d.ts.map +1 -0
  76. package/dist/health/index.js +2 -0
  77. package/dist/health/index.js.map +1 -0
  78. package/dist/markdown/figure.d.ts +44 -0
  79. package/dist/markdown/figure.d.ts.map +1 -0
  80. package/dist/markdown/figure.js +56 -0
  81. package/dist/markdown/figure.js.map +1 -0
  82. package/dist/markdown/figures.d.ts +94 -0
  83. package/dist/markdown/figures.d.ts.map +1 -0
  84. package/dist/markdown/figures.js +126 -0
  85. package/dist/markdown/figures.js.map +1 -0
  86. package/dist/markdown/guide.d.ts +26 -7
  87. package/dist/markdown/guide.d.ts.map +1 -1
  88. package/dist/markdown/guide.js +27 -6
  89. package/dist/markdown/guide.js.map +1 -1
  90. package/dist/markdown/index.d.ts +2 -0
  91. package/dist/markdown/index.d.ts.map +1 -1
  92. package/dist/markdown/index.js +2 -0
  93. package/dist/markdown/index.js.map +1 -1
  94. package/dist/release/changelog.d.ts +19 -0
  95. package/dist/release/changelog.d.ts.map +1 -1
  96. package/dist/release/changelog.js +37 -6
  97. package/dist/release/changelog.js.map +1 -1
  98. package/dist/release/index.d.ts +1 -1
  99. package/dist/release/index.d.ts.map +1 -1
  100. package/dist/release/index.js +1 -1
  101. package/dist/release/index.js.map +1 -1
  102. package/dist/whats-new/body.d.ts +81 -0
  103. package/dist/whats-new/body.d.ts.map +1 -0
  104. package/dist/whats-new/body.js +29 -0
  105. package/dist/whats-new/body.js.map +1 -0
  106. package/dist/whats-new/index.d.ts +24 -0
  107. package/dist/whats-new/index.d.ts.map +1 -0
  108. package/dist/whats-new/index.js +24 -0
  109. package/dist/whats-new/index.js.map +1 -0
  110. package/dist/whats-new/seen.d.ts +23 -0
  111. package/dist/whats-new/seen.d.ts.map +1 -0
  112. package/dist/whats-new/seen.js +33 -0
  113. package/dist/whats-new/seen.js.map +1 -0
  114. package/dist/whats-new/select.d.ts +89 -0
  115. package/dist/whats-new/select.d.ts.map +1 -0
  116. package/dist/whats-new/select.js +117 -0
  117. package/dist/whats-new/select.js.map +1 -0
  118. package/dist/whats-new/use-whats-new.d.ts +36 -0
  119. package/dist/whats-new/use-whats-new.d.ts.map +1 -0
  120. package/dist/whats-new/use-whats-new.js +81 -0
  121. package/dist/whats-new/use-whats-new.js.map +1 -0
  122. package/docs/ReleaseProcess.md +12 -0
  123. package/package.json +25 -1
@@ -0,0 +1,89 @@
1
+ import { type ChangeType, type ChangelogRelease } from "../release/changelog.js";
2
+ /**
3
+ * What a signed-in person is told about the releases since they last looked —
4
+ * worked out on the server, from the app's `CHANGELOG` and the one version it
5
+ * stores against them.
6
+ *
7
+ * Pure: no React, no clock unless one is passed, nothing read or written. The
8
+ * signed-in layout calls `whatsNew` and hands the answer to the client, which
9
+ * is why the answer holds the public wording and nothing else: a change marked
10
+ * `internal`, a release not yet reviewed, and the team's wording of anything
11
+ * the review reworded never leave the server.
12
+ */
13
+ /** One change the dialog leads with, in the public's words. */
14
+ export interface WhatsNewHighlight {
15
+ version: string;
16
+ /** ISO date of its release. */
17
+ date: string;
18
+ /** Its release's public headline. */
19
+ releaseTitle: string;
20
+ /** Its section's public heading ("Invoices"). */
21
+ heading: string;
22
+ type: ChangeType;
23
+ title: string;
24
+ text: string;
25
+ /** Its release's fragment id on the changelog page, `v1-4-0`. */
26
+ anchor: string;
27
+ }
28
+ export interface WhatsNewData {
29
+ /** The newest release in the changelog: what dismissing stores. */
30
+ latestVersion: string;
31
+ /** The version stored against the person, as read — null when there was none worth reading. */
32
+ since: string | null;
33
+ /** How many reviewed releases have come out since `since`. */
34
+ releaseCount: number;
35
+ /** The changes the dialog leads with, `changed` first, at most `maxItems`. */
36
+ highlights: WhatsNewHighlight[];
37
+ /** How many more would have qualified as highlights. */
38
+ moreCount: number;
39
+ /** The fragment id of the newest unseen public release, for "See everything in the changelog". */
40
+ anchor: string | null;
41
+ /** Open the dialog: something new or changed since they last looked, and long enough since they last did. */
42
+ shouldShow: boolean;
43
+ /** Nothing was stored (a new account, or a value that isn't a version): store `latestVersion` without a word. */
44
+ stampSilently: boolean;
45
+ }
46
+ export interface WhatsNewOptions {
47
+ /** The most highlights to return. Defaults to 5; the rest are counted in `moreCount`. */
48
+ maxItems?: number;
49
+ /**
50
+ * The types that can be highlights, in the order they are shown. Defaults to
51
+ * `changed` (someone may need to act), `new`, `improved` — a fix is the
52
+ * changelog's business, not a reason to interrupt someone.
53
+ */
54
+ highlightTypes?: readonly ChangeType[];
55
+ /** The types that open the dialog. Defaults to `new` and `changed`: improvements alone wait for the next one. */
56
+ showFor?: readonly ChangeType[];
57
+ /** Sections whose changes are never highlights, matched case-insensitively. Defaults to `DEFAULT_SKIP_HEADINGS`. */
58
+ skipHeadings?: readonly string[];
59
+ /**
60
+ * Days to wait after the stored version's release date before showing again.
61
+ * Defaults to 0. An app releasing several times a day sets 7: the date of the
62
+ * version someone last stored stands in for when they last saw the dialog, so
63
+ * no second column is needed — they stored the newest release there was.
64
+ */
65
+ minDaysBetween?: number;
66
+ /** The time to measure `minDaysBetween` against. Defaults to now. */
67
+ now?: Date | number;
68
+ /** The person's role, matched against `roles` on changes and sections. Without one, only changes for everyone. */
69
+ role?: string;
70
+ }
71
+ export declare const DEFAULT_SKIP_HEADINGS: readonly string[];
72
+ export declare const DEFAULT_HIGHLIGHT_TYPES: readonly ChangeType[];
73
+ export declare const DEFAULT_SHOW_FOR: readonly ChangeType[];
74
+ export declare const WHATS_NEW_MAX_ITEMS = 5;
75
+ /**
76
+ * What's new for someone who last stored `lastSeen`, or null when the
77
+ * changelog has no release to speak of.
78
+ *
79
+ * - Unseen means every release newer than `lastSeen` by version, so a stored
80
+ * version the changelog no longer holds still works, and one newer than the
81
+ * changelog (a rollback) has nothing unseen and stores nothing.
82
+ * - Only reviewed releases count, through the same public wording as
83
+ * `publicRelease`, and without the generic "Behind the scenes" line — there is
84
+ * no cap of five, as `publicChangelog` has, because a week of AltEd is twenty-five.
85
+ * - `lastSeen` missing or not a version: nothing shown, `stampSilently`, so a
86
+ * new account isn't greeted by a hundred releases.
87
+ */
88
+ export declare function whatsNew(changelog: readonly ChangelogRelease[], lastSeen: string | null | undefined, { maxItems, highlightTypes, showFor, skipHeadings, minDaysBetween, now, role, }?: WhatsNewOptions): WhatsNewData | null;
89
+ //# sourceMappingURL=select.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/whats-new/select.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,UAAU,EACf,KAAK,gBAAgB,EACtB,MAAM,yBAAyB,CAAC;AAGjC;;;;;;;;;;GAUG;AAEH,+DAA+D;AAC/D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,YAAY;IAC3B,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,+FAA+F;IAC/F,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,kGAAkG;IAClG,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,6GAA6G;IAC7G,UAAU,EAAE,OAAO,CAAC;IACpB,iHAAiH;IACjH,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,yFAAyF;IACzF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,iHAAiH;IACjH,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,oHAAoH;IACpH,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qEAAqE;IACrE,GAAG,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACpB,kHAAkH;IAClH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAAgD,CAAC;AACpG,eAAO,MAAM,uBAAuB,EAAE,SAAS,UAAU,EAAmC,CAAC;AAC7F,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAAuB,CAAC;AAC1E,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAiBrC;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CACtB,SAAS,EAAE,SAAS,gBAAgB,EAAE,EACtC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACnC,EACE,QAA8B,EAC9B,cAAwC,EACxC,OAA0B,EAC1B,YAAoC,EACpC,cAAkB,EAClB,GAAG,EACH,IAAI,GACL,GAAE,eAAoB,GACtB,YAAY,GAAG,IAAI,CAkFrB"}
@@ -0,0 +1,117 @@
1
+ import { isInternalChange, publicHeading, publicWording, releaseAnchor, } from "../release/changelog.js";
2
+ import { compareVersions, isReleaseVersion } from "../release/version.js";
3
+ export const DEFAULT_SKIP_HEADINGS = ["Fixes", "Bug fixes", "Behind the scenes"];
4
+ export const DEFAULT_HIGHLIGHT_TYPES = ["changed", "new", "improved"];
5
+ export const DEFAULT_SHOW_FOR = ["new", "changed"];
6
+ export const WHATS_NEW_MAX_ITEMS = 5;
7
+ const DAY_MS = 24 * 60 * 60 * 1000;
8
+ const forRole = (roles, role) => roles === undefined || (role !== undefined && roles.includes(role));
9
+ /**
10
+ * What's new for someone who last stored `lastSeen`, or null when the
11
+ * changelog has no release to speak of.
12
+ *
13
+ * - Unseen means every release newer than `lastSeen` by version, so a stored
14
+ * version the changelog no longer holds still works, and one newer than the
15
+ * changelog (a rollback) has nothing unseen and stores nothing.
16
+ * - Only reviewed releases count, through the same public wording as
17
+ * `publicRelease`, and without the generic "Behind the scenes" line — there is
18
+ * no cap of five, as `publicChangelog` has, because a week of AltEd is twenty-five.
19
+ * - `lastSeen` missing or not a version: nothing shown, `stampSilently`, so a
20
+ * new account isn't greeted by a hundred releases.
21
+ */
22
+ export function whatsNew(changelog, lastSeen, { maxItems = WHATS_NEW_MAX_ITEMS, highlightTypes = DEFAULT_HIGHLIGHT_TYPES, showFor = DEFAULT_SHOW_FOR, skipHeadings = DEFAULT_SKIP_HEADINGS, minDaysBetween = 0, now, role, } = {}) {
23
+ const releases = changelog
24
+ .filter((release) => isReleaseVersion(release.version))
25
+ .sort((a, b) => compareVersions(b.version, a.version));
26
+ const newest = releases[0];
27
+ if (!newest)
28
+ return null;
29
+ const stored = typeof lastSeen === "string" ? lastSeen.trim() : "";
30
+ const nothing = {
31
+ latestVersion: newest.version,
32
+ since: null,
33
+ releaseCount: 0,
34
+ highlights: [],
35
+ moreCount: 0,
36
+ anchor: null,
37
+ shouldShow: false,
38
+ stampSilently: false,
39
+ };
40
+ if (!isReleaseVersion(stored))
41
+ return { ...nothing, stampSilently: true };
42
+ const unseen = releases.filter((release) => release.public && compareVersions(release.version, stored) > 0);
43
+ const skipped = new Set(skipHeadings.map((heading) => heading.trim().toLowerCase()));
44
+ const candidates = [];
45
+ unseen.forEach((release, releaseIndex) => {
46
+ const releaseTitle = release.public?.title ?? release.title;
47
+ // Sections sharing a public heading are one section on the public page, placed where the first one was.
48
+ const headings = release.sections.map(publicHeading);
49
+ release.sections.forEach((section, part) => {
50
+ const heading = publicHeading(section);
51
+ section.changes.forEach((change, changeIndex) => {
52
+ if (isInternalChange(change, section))
53
+ return;
54
+ if (!forRole(section.roles, role) || !forRole(change.roles, role))
55
+ return;
56
+ if (change.highlight === false)
57
+ return;
58
+ const forced = change.highlight === true;
59
+ if (!forced && (!highlightTypes.includes(change.type) || skipped.has(heading.trim().toLowerCase())))
60
+ return;
61
+ const rank = highlightTypes.indexOf(change.type);
62
+ candidates.push({
63
+ highlight: {
64
+ version: release.version,
65
+ date: release.date,
66
+ releaseTitle,
67
+ heading,
68
+ type: change.type,
69
+ ...publicWording(change),
70
+ anchor: releaseAnchor(release.version),
71
+ },
72
+ forced,
73
+ rank: rank === -1 ? highlightTypes.length : rank,
74
+ release: releaseIndex,
75
+ section: headings.indexOf(heading),
76
+ part,
77
+ change: changeIndex,
78
+ });
79
+ });
80
+ });
81
+ });
82
+ const shown = (a, b) => a.rank - b.rank || a.release - b.release || a.section - b.section || a.part - b.part || a.change - b.change;
83
+ // A forced highlight is guaranteed a place; the rest are taken in the order they are shown.
84
+ const kept = new Set([...candidates]
85
+ .sort((a, b) => Number(b.forced) - Number(a.forced) || shown(a, b))
86
+ .slice(0, Math.max(0, Math.floor(maxItems))));
87
+ const highlights = candidates
88
+ .filter((candidate) => kept.has(candidate))
89
+ .sort(shown)
90
+ .map((candidate) => candidate.highlight);
91
+ const worthShowing = candidates.some((candidate) => candidate.forced || showFor.includes(candidate.highlight.type));
92
+ return {
93
+ ...nothing,
94
+ since: stored,
95
+ releaseCount: unseen.length,
96
+ highlights,
97
+ moreCount: candidates.length - highlights.length,
98
+ anchor: unseen[0] ? releaseAnchor(unseen[0].version) : null,
99
+ shouldShow: worthShowing && longEnoughSince(releases, stored, minDaysBetween, now),
100
+ };
101
+ }
102
+ /**
103
+ * Whether `minDaysBetween` days have passed since the stored version's release
104
+ * date. A version the changelog doesn't hold, or a date that won't parse, has
105
+ * nothing to wait for.
106
+ */
107
+ function longEnoughSince(releases, stored, minDaysBetween, now) {
108
+ if (!(minDaysBetween > 0))
109
+ return true;
110
+ const seen = releases.find((release) => release.version === stored);
111
+ const released = seen ? Date.parse(`${seen.date}T00:00:00Z`) : Number.NaN;
112
+ if (Number.isNaN(released))
113
+ return true;
114
+ const at = now === undefined ? Date.now() : typeof now === "number" ? now : now.getTime();
115
+ return at - released >= minDaysBetween * DAY_MS;
116
+ }
117
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/whats-new/select.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { WhatsNewData } from "./select.js";
2
+ export interface UseWhatsNewOptions {
3
+ /** `whatsNew(...)` from the signed-in layout, or null for nobody (signed out, or not in the audience). */
4
+ initial: WhatsNewData | null;
5
+ /**
6
+ * Store the version the person has now seen — the app's `POST /api/whats-new/seen`.
7
+ * `false` or a throw means it did not take. Use `keepalive` on the request:
8
+ * following the changelog link may unload the page while it is in flight.
9
+ */
10
+ markSeen: (version: string) => Promise<boolean>;
11
+ /** Somebody viewing as this person: never opens, never stores. */
12
+ readOnly?: boolean;
13
+ }
14
+ export interface WhatsNew {
15
+ open: boolean;
16
+ /** For the dialog's `onOpenChange`. Closing it any way — Escape, a click outside — counts as seen. */
17
+ setOpen: (open: boolean) => void;
18
+ data: WhatsNewData | null;
19
+ /** Close at once and store `latestVersion`. */
20
+ dismiss: () => void;
21
+ /** For the changelog link: following it counts as seen. */
22
+ onChangelogClick: () => void;
23
+ }
24
+ /**
25
+ * When the "what's new" dialog opens, and what closing it stores.
26
+ *
27
+ * It opens once, on mount, when the server said `shouldShow` — never while
28
+ * someone is viewing as the person. A new account (`stampSilently`) stores the
29
+ * newest version without opening, so its first visit after the next release
30
+ * says only what came out since it arrived. Closing, however it's done, closes
31
+ * at once and stores the newest version; if that fails the person is told
32
+ * through the app's `ActionFeedbackProvider`, and the dialog stays closed for
33
+ * this visit rather than coming back to ask again.
34
+ */
35
+ export declare function useWhatsNew({ initial, markSeen, readOnly }: UseWhatsNewOptions): WhatsNew;
36
+ //# sourceMappingURL=use-whats-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-whats-new.d.ts","sourceRoot":"","sources":["../../src/whats-new/use-whats-new.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IACjC,0GAA0G;IAC1G,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,OAAO,CAAC;IACd,sGAAsG;IACtG,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,+CAA+C;IAC/C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,2DAA2D;IAC3D,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAC9B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAgB,EAAE,EAAE,kBAAkB,GAAG,QAAQ,CAkEjG"}
@@ -0,0 +1,81 @@
1
+ "use client";
2
+ import * as React from "react";
3
+ import { useActionReporter } from "../ux/feedback.js";
4
+ /**
5
+ * When the "what's new" dialog opens, and what closing it stores.
6
+ *
7
+ * It opens once, on mount, when the server said `shouldShow` — never while
8
+ * someone is viewing as the person. A new account (`stampSilently`) stores the
9
+ * newest version without opening, so its first visit after the next release
10
+ * says only what came out since it arrived. Closing, however it's done, closes
11
+ * at once and stores the newest version; if that fails the person is told
12
+ * through the app's `ActionFeedbackProvider`, and the dialog stays closed for
13
+ * this visit rather than coming back to ask again.
14
+ */
15
+ export function useWhatsNew({ initial, markSeen, readOnly = false }) {
16
+ const report = useActionReporter();
17
+ const [open, setOpenState] = React.useState(false);
18
+ const isOpen = React.useRef(false);
19
+ const started = React.useRef(false);
20
+ const stored = React.useRef(false);
21
+ // Read through a ref so the callbacks below keep one identity across renders.
22
+ const latest = React.useRef({ initial, markSeen, readOnly, report });
23
+ React.useEffect(() => {
24
+ latest.current = { initial, markSeen, readOnly, report };
25
+ });
26
+ const store = React.useCallback(async (quietly) => {
27
+ const { initial: data, markSeen: save, readOnly: viewingAs, report: tell } = latest.current;
28
+ if (!data || viewingAs || stored.current)
29
+ return;
30
+ stored.current = true;
31
+ let saved = false;
32
+ try {
33
+ saved = await save(data.latestVersion);
34
+ }
35
+ catch {
36
+ saved = false;
37
+ }
38
+ if (saved)
39
+ return;
40
+ // Not stored: the next visit may ask again, which is the honest outcome of a failed save.
41
+ stored.current = false;
42
+ if (quietly)
43
+ return;
44
+ tell({
45
+ tone: "error",
46
+ title: "Couldn't save that you've seen what's new",
47
+ description: "It may show again next time you visit.",
48
+ });
49
+ }, []);
50
+ const show = React.useCallback((next) => {
51
+ isOpen.current = next;
52
+ setOpenState(next);
53
+ }, []);
54
+ // Once, the first time there is an answer: a later render with fresh data must not reopen what was just closed.
55
+ React.useEffect(() => {
56
+ if (started.current || !initial)
57
+ return;
58
+ started.current = true;
59
+ if (readOnly)
60
+ return;
61
+ if (initial.stampSilently) {
62
+ void store(true);
63
+ return;
64
+ }
65
+ if (initial.shouldShow)
66
+ show(true);
67
+ }, [initial, readOnly, store, show]);
68
+ const dismiss = React.useCallback(() => {
69
+ show(false);
70
+ void store(false);
71
+ }, [store, show]);
72
+ const setOpen = React.useCallback((next) => {
73
+ if (next)
74
+ show(true);
75
+ // Closing what is open is a dismissal; "closing" what never opened stores nothing.
76
+ else if (isOpen.current)
77
+ dismiss();
78
+ }, [dismiss, show]);
79
+ return { open, setOpen, data: initial, dismiss, onChangelogClick: dismiss };
80
+ }
81
+ //# sourceMappingURL=use-whats-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-whats-new.js","sourceRoot":"","sources":["../../src/whats-new/use-whats-new.ts"],"names":[],"mappings":"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"}
@@ -164,6 +164,18 @@ The public page adds one line — **Behind the scenes · Reliability and securit
164
164
 
165
165
  The release guard checks it: `publicChangelogProblems(CHANGELOG)` must be empty, and it fails until the newest five releases each have their review.
166
166
 
167
+ ### The "what's new" dialog
168
+
169
+ Signed-in people hear about a release from the dialog in `@connextar/house/whats-new`, which picks a few public changes — `changed` first, then `new`, then `improved`; never a fix, nothing under **Fixes** or **Behind the scenes**. Two optional fields steer it, and neither touches either changelog:
170
+
171
+ | Field | Use it for |
172
+ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- |
173
+ | `highlight: true` on a change | A change the dialog must lead with whatever its type or heading — the fix everyone asked for. Never on an internal change |
174
+ | `highlight: false` on a change | A change that is real but not worth interrupting anyone for |
175
+ | `roles: [...]` on a change / section | Who it is for, by the app's own role names (`["guardian"]`). Left off means everyone; the dialog shows a scoped change to no one else |
176
+
177
+ `releaseHistoryProblems` checks both: a boolean `highlight`, never on an internal change, and a `roles` list of distinct, non-blank names.
178
+
167
179
  ---
168
180
 
169
181
  ## 4. The pieces in code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@connextar/house",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "The pieces every app we build needs and none of them should own a copy of.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,6 +42,22 @@
42
42
  "types": "./dist/auth/step-up-client-index.d.ts",
43
43
  "default": "./dist/auth/step-up-client-index.js"
44
44
  },
45
+ "./admin": {
46
+ "types": "./dist/admin/index.d.ts",
47
+ "default": "./dist/admin/index.js"
48
+ },
49
+ "./admin/second-factor": {
50
+ "types": "./dist/admin/second-factor-index.d.ts",
51
+ "default": "./dist/admin/second-factor-index.js"
52
+ },
53
+ "./admin/client": {
54
+ "types": "./dist/admin/client-index.d.ts",
55
+ "default": "./dist/admin/client-index.js"
56
+ },
57
+ "./admin/testing": {
58
+ "types": "./dist/admin/testing-index.d.ts",
59
+ "default": "./dist/admin/testing-index.js"
60
+ },
45
61
  "./account": {
46
62
  "types": "./dist/account/index.d.ts",
47
63
  "default": "./dist/account/index.js"
@@ -62,6 +78,10 @@
62
78
  "types": "./dist/guides/index.d.ts",
63
79
  "default": "./dist/guides/index.js"
64
80
  },
81
+ "./health": {
82
+ "types": "./dist/health/index.d.ts",
83
+ "default": "./dist/health/index.js"
84
+ },
65
85
  "./trail": {
66
86
  "types": "./dist/trail/index.d.ts",
67
87
  "default": "./dist/trail/index.js"
@@ -102,6 +122,10 @@
102
122
  "types": "./dist/setup-guide/index.d.ts",
103
123
  "default": "./dist/setup-guide/index.js"
104
124
  },
125
+ "./whats-new": {
126
+ "types": "./dist/whats-new/index.d.ts",
127
+ "default": "./dist/whats-new/index.js"
128
+ },
105
129
  "./editor": {
106
130
  "types": "./dist/editor/index.d.ts",
107
131
  "default": "./dist/editor/index.js"