@reykjavik/webtools 0.3.8 → 0.3.10

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/CHANGELOG.md CHANGED
@@ -4,19 +4,19 @@
4
4
 
5
5
  - ... <!-- Add new lines here. -->
6
6
 
7
- ## 0.3.8
7
+ ## 0.3.10
8
8
 
9
9
  _2026-03-16_
10
10
 
11
- - `@reykjavik/webtools/alertsStore/react`
12
- - fix: Wrong parameter type signature for `makeReactSubscription`
11
+ - `@reykjavik/webtools/alertsStore/react`:
12
+ - fix: Add missing `onClick` prop to `LinkRendererProps`
13
13
 
14
- ## 0.3.7
14
+ ## 0.3.7 – 0.3.9
15
15
 
16
16
  _2026-03-16_
17
17
 
18
18
  - feat: Add `@reykjavik/webtools/alertsStore` for toasts and other global UI
19
- feedback messages along with `@reykjavik/webtools/alertsStore/react` helpers
19
+ feedback messages along with helpers
20
20
 
21
21
  ## 0.3.6
22
22
 
package/README.md CHANGED
@@ -1164,14 +1164,17 @@ import { Toast } from '../components/Toast';
1164
1164
  #### `renderAlertMessage`
1165
1165
 
1166
1166
  **Syntax:**
1167
- `renderAlertMessage(message: AlertInfo['message'], linkComponent?: renderAlertMessage.LinkRenderer): ReactNode`
1167
+ `renderAlertMessage(message: AlertInfo['message'], onLinkClick?: (e: MouseEvent) => void, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode`
1168
1168
 
1169
1169
  Helper to render an alerter alert message, which can be a simple string or a
1170
1170
  more complex array of strings and objects representing links and rich (bold)
1171
1171
  text formatting.
1172
1172
 
1173
+ You can optionally pass an additional `onLinkClick` handler as a second
1174
+ parameter. (For example the alert's `dismiss` dispatcher.)
1175
+
1173
1176
  It renders link objects as simple `<a href="" />` elements, by default, but
1174
- you can optionally provide a custom `linkComponent` as a second parameter.
1177
+ you can optionally provide a custom `linkComponent` as a third parameter.
1175
1178
 
1176
1179
  Third
1177
1180
 
@@ -1181,18 +1184,11 @@ import Link from 'next/link';
1181
1184
 
1182
1185
  import { AlertInfo } from '../alertsStore';
1183
1186
 
1184
- export const Toast = (props: AlertInfo) => {
1185
- const dismissOnLinkClick = (e: React.MouseEvent) => {
1186
- if ((e.target as HTMLElement).closest('a')) {
1187
- props.dismiss(); // Dismiss the alert when a link is clicked
1188
- }
1189
- };
1190
- return (
1191
- <div class="toast" onClick={dismissOnLinkClick}>
1192
- {renderAlertMessage(props.message, Link)}
1193
- </div>
1194
- );
1195
- };
1187
+ export const Toast = (props: AlertInfo) => (
1188
+ <div class="toast">
1189
+ {renderAlertMessage(props.message, Link, props.dismiss)}
1190
+ </div>
1191
+ );
1196
1192
  ```
1197
1193
 
1198
1194
  To build your own custom `LinkComponent`, you can use the
@@ -1209,7 +1205,7 @@ const MyWrappedLink: renderAlertMessage.LinkRenderer = (props) => {
1209
1205
 
1210
1206
  // Then elsewhere in your Alert/Toast component
1211
1207
  <div class="toast__message">
1212
- {renderAlertMessage(props.message, MyWrappedLink)};
1208
+ {renderAlertMessage(props.message, MyWrappedLink, props.dismiss)};
1213
1209
  </div>;
1214
1210
  ```
1215
1211
 
@@ -1220,7 +1216,7 @@ call `renderAlertMessage`, you can use the
1220
1216
  #### `renderAlertMessage.withLinkRenderer`
1221
1217
 
1222
1218
  **Syntax:**
1223
- `renderAlertMessage.withLinkRenderer(LinkComponent: renderAlertMessage.LinkRenderer): (message: AlertInfo['message']):ReactNode`
1219
+ `renderAlertMessage.withLinkRenderer(LinkComponent: renderAlertMessage.LinkRenderer): (message: AlertInfo['message'], onLinkClick?: (e: MouseEvent) => void):ReactNode`
1224
1220
 
1225
1221
  It returns a curried version of [`renderAlertMessage`](#renderAlertMessage)
1226
1222
  that uses the passed `LinkComponent` for rendering links in alert messages.
@@ -1231,7 +1227,7 @@ const curriedRenderAlertMessage =
1231
1227
 
1232
1228
  // Then elsewhere in your Alert/Toast component
1233
1229
  <div class="toast__message">
1234
- {renderAlertMessage(props.message, MyWrappedLink)};
1230
+ {renderAlertMessage(props.message, props.dismiss)};
1235
1231
  </div>;
1236
1232
  ```
1237
1233
 
@@ -1,4 +1,4 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
2
  import { AlertMessage } from './index.js';
3
3
  type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, meta: {
4
4
  type: string;
@@ -24,13 +24,14 @@ export declare const makeReactSubscription: <AlertInfo>(subscribe: SubsScriber<A
24
24
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
25
25
  */
26
26
  export declare const renderAlertMessage: {
27
- (message: AlertMessage, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
28
- withLinkRenderer(LinkCompnent: renderAlertMessage.LinkRenderer): (message: AlertMessage) => React.ReactNode;
27
+ (message: AlertMessage, onLinkClick?: (e: MouseEvent) => void, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
28
+ withLinkRenderer(LinkCompnent: renderAlertMessage.LinkRenderer): (message: AlertMessage, onLinkClick: (e: MouseEvent) => void) => React.ReactNode;
29
29
  };
30
30
  export declare namespace renderAlertMessage {
31
31
  type LinkRendererProps = Omit<Extract<AlertMessage[number], {
32
32
  tag: 'a';
33
33
  }>, 'tag' | 'text'> & {
34
+ onClick?: (e: MouseEvent) => void;
34
35
  children: ReactNode;
35
36
  };
36
37
  export type LinkRenderer = (props: LinkRendererProps) => ReactNode;
@@ -66,7 +66,7 @@ exports.makeReactSubscription = makeReactSubscription;
66
66
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
67
67
  */
68
68
  /*#__NO_SIDE_EFFECTS__*/
69
- const renderAlertMessage = (message, linkComponent) => {
69
+ const renderAlertMessage = (message, onLinkClick, linkComponent) => {
70
70
  const Link = linkComponent || 'a';
71
71
  return typeof message === 'string'
72
72
  ? message
@@ -78,7 +78,7 @@ const renderAlertMessage = (message, linkComponent) => {
78
78
  const { text, tag, ...linkProps } = part;
79
79
  return [
80
80
  ' ',
81
- react_1.default.createElement(Link, { key: i, ...linkProps }, text),
81
+ react_1.default.createElement(Link, { key: i, ...linkProps, onClick: onLinkClick && ((e) => onLinkClick(e)) }, text),
82
82
  ];
83
83
  }
84
84
  return [' ', react_1.default.createElement(part.tag, { key: i }, part.text)];
@@ -93,4 +93,4 @@ exports.renderAlertMessage = renderAlertMessage;
93
93
  */
94
94
  /*#__NO_SIDE_EFFECTS__*/
95
95
  exports.renderAlertMessage.withLinkRenderer =
96
- (LinkCompnent) => (message) => (0, exports.renderAlertMessage)(message, LinkCompnent);
96
+ (LinkCompnent) => (message, onLinkClick) => (0, exports.renderAlertMessage)(message, onLinkClick, LinkCompnent);
@@ -1,4 +1,4 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
2
  import { AlertMessage } from './index.js';
3
3
  type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, meta: {
4
4
  type: string;
@@ -24,13 +24,14 @@ export declare const makeReactSubscription: <AlertInfo>(subscribe: SubsScriber<A
24
24
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
25
25
  */
26
26
  export declare const renderAlertMessage: {
27
- (message: AlertMessage, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
28
- withLinkRenderer(LinkCompnent: renderAlertMessage.LinkRenderer): (message: AlertMessage) => React.ReactNode;
27
+ (message: AlertMessage, onLinkClick?: (e: MouseEvent) => void, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
28
+ withLinkRenderer(LinkCompnent: renderAlertMessage.LinkRenderer): (message: AlertMessage, onLinkClick: (e: MouseEvent) => void) => React.ReactNode;
29
29
  };
30
30
  export declare namespace renderAlertMessage {
31
31
  type LinkRendererProps = Omit<Extract<AlertMessage[number], {
32
32
  tag: 'a';
33
33
  }>, 'tag' | 'text'> & {
34
+ onClick?: (e: MouseEvent) => void;
34
35
  children: ReactNode;
35
36
  };
36
37
  export type LinkRenderer = (props: LinkRendererProps) => ReactNode;
@@ -29,7 +29,7 @@ export const makeReactSubscription = (subscribe) => {
29
29
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
30
30
  */
31
31
  /*#__NO_SIDE_EFFECTS__*/
32
- export const renderAlertMessage = (message, linkComponent) => {
32
+ export const renderAlertMessage = (message, onLinkClick, linkComponent) => {
33
33
  const Link = linkComponent || 'a';
34
34
  return typeof message === 'string'
35
35
  ? message
@@ -41,7 +41,7 @@ export const renderAlertMessage = (message, linkComponent) => {
41
41
  const { text, tag, ...linkProps } = part;
42
42
  return [
43
43
  ' ',
44
- React.createElement(Link, { key: i, ...linkProps }, text),
44
+ React.createElement(Link, { key: i, ...linkProps, onClick: onLinkClick && ((e) => onLinkClick(e)) }, text),
45
45
  ];
46
46
  }
47
47
  return [' ', React.createElement(part.tag, { key: i }, part.text)];
@@ -55,4 +55,4 @@ export const renderAlertMessage = (message, linkComponent) => {
55
55
  */
56
56
  /*#__NO_SIDE_EFFECTS__*/
57
57
  renderAlertMessage.withLinkRenderer =
58
- (LinkCompnent) => (message) => renderAlertMessage(message, LinkCompnent);
58
+ (LinkCompnent) => (message, onLinkClick) => renderAlertMessage(message, onLinkClick, LinkCompnent);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reykjavik/webtools",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "description": "Misc. JS/TS helpers used by Reykjavík City's web dev teams.",
5
5
  "main": "index.js",
6
6
  "repository": "ssh://git@github.com:reykjavikcity/webtools.git",