SimpleExample.vala 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using Astralis;
  2. using Invercargill;
  3. using Invercargill.DataStructures;
  4. using Inversion;
  5. using Spry;
  6. class TestComponent : Component {
  7. public override string markup { get {
  8. return """
  9. <!DOCTYPE html>
  10. <html>
  11. <head>
  12. <script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.8/dist/htmx.min.js"></script>
  13. </head>
  14. <body>
  15. <h1>Hello, World!</h1>
  16. <spry-outlet sid="content" />
  17. </body>
  18. </html>
  19. """;
  20. }}
  21. public void add_content(Renderable content) {
  22. add_outlet_child("content", content);
  23. }
  24. }
  25. class ContentComponent : Component {
  26. public override string markup { get {
  27. return """
  28. <p>Quia assumenda sunt qui. Voluptatibus magni exercitationem tenetur sit itaque laborum aut. Sint voluptates fugit consectetur.</p>
  29. <p>Optio totam doloremque minus impedit est eum. Nisi a rerum natus. Impedit est autem culpa ullam reprehenderit sunt. Et harum odio cumque iure.</p>
  30. <p>Architecto non ipsum quibusdam aut. Deleniti enim magnam aperiam voluptatibus similique dolor. Porro et aliquam et eum magnam neque praesentium.</p>
  31. <p>Quod at nemo rem fugit quia nemo facere et. Fugit sed labore voluptates recusandae dolores sed. Consequatur autem sit minima sunt excepturi et fugiat voluptates. Repellat aut vero doloribus quis laborum repellat dolorem et.</p>
  32. <p>Porro at id optio sit voluptatibus nulla quam. Dignissimos praesentium est dolore architecto voluptatem adipisci nostrum. In dolorum et qui distinctio. Aperiam et eligendi quod eaque.</p>
  33. """;
  34. }}
  35. }
  36. class MessageFormComponent : Component {
  37. private ComponentUriProvider component_uri_provider = inject<ComponentUriProvider>();
  38. public override string markup { get {
  39. return """
  40. <form sid="form" spry-action="UserContentComponent:SendMessage" spry-target="result">
  41. <input type="text" name="message" placeholder="Your message here"/>
  42. <input type="submit"/>
  43. </form>
  44. <div sid="result">
  45. <em>Message will show here</em>
  46. </div>
  47. """;
  48. }}
  49. }
  50. class UserContentComponent : Component {
  51. public override string markup { get {
  52. return """
  53. <p>You said: <strong sid="message"></strong> <em>(via <span sid="action"></span>)</em></p>
  54. """;
  55. }}
  56. private HttpContext http_context = inject<HttpContext>();
  57. public async override void handle_action(string action) throws Error {
  58. this["message"].text_content = http_context.request.query_params.get_any_or_default("message") ?? "No message provided!";
  59. this["action"].text_content = action;
  60. }
  61. }
  62. class HomePageEndpoint : Object, Endpoint {
  63. private TestComponent test_component = inject<TestComponent>();
  64. private ContentComponent content_component = inject<ContentComponent>();
  65. private MessageFormComponent message_form = inject<MessageFormComponent>();
  66. public async Astralis.HttpResult handle_request(Astralis.HttpContext http_context, Astralis.RouteContext route_context) throws Error {
  67. test_component.add_content(content_component);
  68. test_component.add_content(message_form);
  69. return yield test_component.to_result();
  70. }
  71. }
  72. void main(string[] args) {
  73. int port = args.length > 1 ? int.parse(args[1]) : 8080;
  74. try {
  75. var application = new WebApplication(port);
  76. // Register compression components
  77. application.use_compression();
  78. // Add Spry
  79. application.add_module<SpryModule>();
  80. // Register components
  81. application.add_transient<TestComponent>();
  82. application.add_transient<ContentComponent>();
  83. application.add_transient<MessageFormComponent>();
  84. application.add_transient<UserContentComponent>();
  85. // Register endpoints
  86. application.add_endpoint<HomePageEndpoint>(new EndpointRoute("/"));
  87. application.run();
  88. } catch (Error e) {
  89. printerr("Error: %s\n", e.message);
  90. Process.exit(1);
  91. }
  92. }