@reykjavik/webtools 0.3.7 → 0.3.9

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,7 +4,14 @@
4
4
 
5
5
  - ... <!-- Add new lines here. -->
6
6
 
7
- ## 0.3.7
7
+ ## 0.3.9
8
+
9
+ _2026-03-16_
10
+
11
+ - `@reykjavik/webtools/alertsStore/react`:
12
+ - feat: Add convenience `onLinkClick` parameter to `renderAlertMessage`
13
+
14
+ ## 0.3.7 – 0.3.8
8
15
 
9
16
  _2026-03-16_
10
17
 
package/README.md CHANGED
@@ -1164,14 +1164,15 @@ 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'], linkComponent?: renderAlertMessage.LinkRenderer, onLinkClick?: (e: MouseEvent) => void): 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
1173
  It renders link objects as simple `<a href="" />` elements, by default, but
1174
- you can optionally provide a custom `linkComponent` as a second parameter.
1174
+ you can optionally provide a custom `linkComponent` as a second parameter,
1175
+ with an additional `onLinkClick` handler for the links.
1175
1176
 
1176
1177
  Third
1177
1178
 
@@ -1181,18 +1182,11 @@ import Link from 'next/link';
1181
1182
 
1182
1183
  import { AlertInfo } from '../alertsStore';
1183
1184
 
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
- };
1185
+ export const Toast = (props: AlertInfo) => (
1186
+ <div class="toast">
1187
+ {renderAlertMessage(props.message, Link, props.dismiss)}
1188
+ </div>
1189
+ );
1196
1190
  ```
1197
1191
 
1198
1192
  To build your own custom `LinkComponent`, you can use the
@@ -1209,7 +1203,7 @@ const MyWrappedLink: renderAlertMessage.LinkRenderer = (props) => {
1209
1203
 
1210
1204
  // Then elsewhere in your Alert/Toast component
1211
1205
  <div class="toast__message">
1212
- {renderAlertMessage(props.message, MyWrappedLink)};
1206
+ {renderAlertMessage(props.message, MyWrappedLink, props.dismiss)};
1213
1207
  </div>;
1214
1208
  ```
1215
1209
 
@@ -1220,7 +1214,7 @@ call `renderAlertMessage`, you can use the
1220
1214
  #### `renderAlertMessage.withLinkRenderer`
1221
1215
 
1222
1216
  **Syntax:**
1223
- `renderAlertMessage.withLinkRenderer(LinkComponent: renderAlertMessage.LinkRenderer): (message: AlertInfo['message']):ReactNode`
1217
+ `renderAlertMessage.withLinkRenderer(LinkComponent: renderAlertMessage.LinkRenderer): (message: AlertInfo['message'], onLinkClick?: (e: MouseEvent) => void):ReactNode`
1224
1218
 
1225
1219
  It returns a curried version of [`renderAlertMessage`](#renderAlertMessage)
1226
1220
  that uses the passed `LinkComponent` for rendering links in alert messages.
@@ -1231,7 +1225,7 @@ const curriedRenderAlertMessage =
1231
1225
 
1232
1226
  // Then elsewhere in your Alert/Toast component
1233
1227
  <div class="toast__message">
1234
- {renderAlertMessage(props.message, MyWrappedLink)};
1228
+ {renderAlertMessage(props.message, props.dismiss)};
1235
1229
  </div>;
1236
1230
  ```
1237
1231
 
@@ -1,6 +1,9 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
2
  import { AlertMessage } from './index.js';
3
- type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, _type: string) => void) => () => void;
3
+ type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, meta: {
4
+ type: string;
5
+ ids: Array<string>;
6
+ }) => void) => () => void;
4
7
  /**
5
8
  * Factory function that creates a React subscription hook and a container
6
9
  * component linked to a specific alerter store subscibe function.
@@ -21,8 +24,8 @@ export declare const makeReactSubscription: <AlertInfo>(subscribe: SubsScriber<A
21
24
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
22
25
  */
23
26
  export declare const renderAlertMessage: {
24
- (message: AlertMessage, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
25
- 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;
26
29
  };
27
30
  export declare namespace renderAlertMessage {
28
31
  type LinkRendererProps = Omit<Extract<AlertMessage[number], {
@@ -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,6 +1,9 @@
1
- import React, { ReactNode } from 'react';
1
+ import React, { MouseEvent, ReactNode } from 'react';
2
2
  import { AlertMessage } from './index.js';
3
- type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, _type: string) => void) => () => void;
3
+ type SubsScriber<AlertInfo> = (callback: (alerts: Array<AlertInfo>, meta: {
4
+ type: string;
5
+ ids: Array<string>;
6
+ }) => void) => () => void;
4
7
  /**
5
8
  * Factory function that creates a React subscription hook and a container
6
9
  * component linked to a specific alerter store subscibe function.
@@ -21,8 +24,8 @@ export declare const makeReactSubscription: <AlertInfo>(subscribe: SubsScriber<A
21
24
  * @see https://github.com/reykjavikcity/webtools/blob/v0.3/README.md#renderalertmessage
22
25
  */
23
26
  export declare const renderAlertMessage: {
24
- (message: AlertMessage, linkComponent?: renderAlertMessage.LinkRenderer): ReactNode;
25
- 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;
26
29
  };
27
30
  export declare namespace renderAlertMessage {
28
31
  type LinkRendererProps = Omit<Extract<AlertMessage[number], {
@@ -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.7",
3
+ "version": "0.3.9",
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",